grep на основе черного списка - без процедурного кода? - PullRequest
5 голосов
/ 10 октября 2011

Это известная задача, которую легко описать:

При наличии текстового файла foo.txt и файла черного списка исключающих строк, по одной на строку, создается файл foo_filtered.txt, содержащий только строкиfoo.txt, который не содержит строки исключения.

Распространенным приложением является фильтрация предупреждений компилятора из журнала сборки, но игнорирование предупреждений для файлов, которые не являются вашими.Файл foo.txt - это файл предупреждений (сам по себе отфильтрованный из журнала сборки) и файл черного списка исключенных_файлов.txt с именами файлов, по одному на строку.

Я знаю, как это делается на процедурных языках, таких как Perl илиAWK, и я даже сделал это с помощью комбинаций команд Linux, таких как cut, comm и sort.

Но я чувствую, что должен быть очень близок с xargs и просто не могу видеть последний шаг.

Я знаю, что если в exclusive_filenames.txt есть только 1 имя файла, то

grep -v foo.txt `cat excluded_filenames.txt`

сделает это.

И я знаю, что могу получитьимена файлов по одному на строку с

xargs -L1 -a excluded_filenames.txt

Итак, как мне объединить эти два в одно решение без явных циклов в процедурном языке?

Ищете простое и элегантное решение.

1 Ответ

9 голосов
/ 10 октября 2011

Вы должны использовать опцию -f (или вы можете использовать fgrep, что тоже самое):

grep -vf excluded_filenames.txt foo.txt

Вы также можете использовать -F, который является более прямым ответом на то, что вы спросили:

grep -vF "`cat excluded_filenames.txt`" foo.txt

от man grep

-f FILE, --file=FILE
          Obtain patterns from FILE, one per line.  The empty file contains zero patterns, and therefore matches nothing.

-F, --fixed-strings
          Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...