2011-10-10 28 views
4

這是一個衆所周知的任務,簡單來形容:grep基於黑名單 - 沒有程序代碼?

給定一個文本文件foo.txt的,和排除字符串,每行一個黑名單文件,產生具有foo.txt的只有線foo_filtered.txt不包含任何排除字符串。

常見的應用程序從生成日誌過濾編譯器警告,但忽略對不屬於自己的文件警告。文件foo.txt是警告文件(它自己從構建日誌中過濾)以及帶有文件名的黑名單文件excluded_filenames.txt,每行一個。

我知道它是如何在像Perl或AWK程序語言做的,我甚至對Linux的組合做它的命令,如剪切,通訊和排序。

但我覺得,我應該非常接近與xargs的,只是看不到最後一步。

我知道,如果excluded_filenames.txt只有1個在它的文件名,然後

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

將做到這一點。

而且我知道,我可以得到一個文件名,每行有

xargs -L1 -a excluded_filenames.txt 

那麼,如何在程序語言結合這兩個成一個單一的解決方案,沒有明確的循環?

尋找簡單而優雅的解決方案。

回答

8

您應該使用-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. 
+0

謝謝! grep比我意識到的更加強大。我想我應該看它的手冊頁第一... – talkaboutquality

+0

我認爲你的回答是輕微不正確,則'cat'在第二個例子中不應該有,線應該是'grep的室顫excluded_filenames.txt FOO。 txt',同時使用'-f'也是明智的選擇,以避免匹配任何字符。 – Hasturkun

+0

@Hasturkun,我不這麼認爲,'excluded_filenames.txt'不是要搜索的文本,它是一個包含模式列表的文件。 –

相關問題