如何限制grep只扫描前10行?

如何限制grep只扫描前10行?

我得到一个命令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

相关内容