我得到一个命令foo
,该命令输出由行分隔的文件列表\n
。
我使用以下命令按文件的正则表达式内容过滤结果。
foo | xargs grep -l regex
问题是有些文件非常大,我正在搜索的内容只能在前 10 行找到。我如何告诉 grep 仅处理前 10 行以加快执行速度?
答案1
正如评论所述,要解决一半的问题:
foo | xargs grep -m 1 regex
要解决其余问题,需要编写更多脚本:
foo | xargs sh -c 'for file; do head "$file"; done | grep regex' sh
但这并没有给你文件名,因为 grep 正在读取一个流。
如果您有 GNU awk:
foo | xargs gawk -v pattern='regex' -v lines=10 -v OFS=':' '
$0 ~ pattern {print FILENAME, FNR, $0}
FNR == lines {nextfile}
'
只获取文件名
$0 ~ pattern {print FILENAME; nextfile}
答案2
for i in $(foo); do echo -e "$i \c"; head -n10 $i | grep -c regex; done
将打印foo
脚本中的文件名,后跟数字。如果数字为零,则不regex
匹配,并且如果不需要,结果中的这些零条目可以轻松过滤掉。
答案3
的修改版本格伦·杰克曼的回答输出文件名:
foo | xargs sh -c 'for file; do head "$file" | grep -l --label="$file" regex; done' sh