tal*_*ity 5 linux grep blacklist
这是一个众所周知的任务,很容易描述:
给定一个文本文件foo.txt和一个排除字符串的黑名单文件,每行一个,生成foo_filtered.txt,它只包含不包含任何排除字符串的foo.txt行.
常见的应用程序是从构建日志中过滤编译器警告,但忽略对不属于您的文件的警告.文件foo.txt是警告文件(本身从构建日志中过滤掉),黑名单文件excluded_filenames.txt,文件名,每行一个.
我知道它是如何在像Perl或AWK这样的过程语言中完成的,我甚至用剪辑,通信和排序等Linux命令组合完成了它.
但我觉得我应该与xargs非常接近,而且看不到最后一步.
我知道如果excluded_filenames.txt中只有1个文件名,那么
grep -v foo.txt `cat excluded_filenames.txt`
Run Code Online (Sandbox Code Playgroud)
会做的.
而且我知道我可以获得每行一个文件名
xargs -L1 -a excluded_filenames.txt
Run Code Online (Sandbox Code Playgroud)
那么如何将这两者合并为一个解决方案,而不使用过程语言中的显式循环?
寻找简单而优雅的解决方案.
您应该使用该-f选项(或者您可以使用fgrep相同的选项):
grep -vf excluded_filenames.txt foo.txt
Run Code Online (Sandbox Code Playgroud)
您也可以使用-F哪个更直接地回答您的要求:
grep -vF "`cat excluded_filenames.txt`" foo.txt
Run Code Online (Sandbox Code Playgroud)
从 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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1416 次 |
| 最近记录: |