如何让grep在N行后停止搜索每个文件?

时间:2013-07-05 02:44:00

标签: linux bash grep

最好用一个假设的例子来描述它的使用:

在大量电子邮件存储中搜索一些有用的标题信息(每个电子邮件位于单独的文件中)。例如使用顶级邮件客户端应用程序的统计数据。

通常如果你做grep,你可以指定-m在第一场比赛时停止,但是假设一封电子邮件没有联系X-Mailer或我们在标题中寻找的是什么?它将扫描整个电子邮件。由于大多数标题都是<50行,因此告诉grep只能在任何文件上搜索50行。我找不到办法做到这一点。

4 个答案:

答案 0 :(得分:2)

我不知道它是否会更快但你可以用awk做到这一点:

 awk '/match me/{print;exit}FNR>50{exit}' *.mail
如果出现在前50行中,

将打印匹配match me的第一行。 (如果你想打印文件名,grep样式,将print;更改为print FILENAME ":" $0;

awk没有任何等效于grep的{​​{1}}标志,但如果您需要递归扫描目录,则可以-r使用find }}:

-exec

您可以通过管道find /base/dir -iname '*.mail' \ -exec awk '/match me/{print FILENAME ":" $0;exit}FNR>50{exit}' {} + head -n50来解决此问题,但由于您必须启动两个新流程(一个grep和一个head,因此无疑会更慢})为每个文件。你只需要一个grep和一个head就可以做到这一点,但是一旦找到魔术线就会失去匹配文件的能力,标记这些行会很尴尬用文件名。

答案 1 :(得分:1)

你可以做这样的事情

head -50 <mailfile>| grep <your keyword>

答案 2 :(得分:1)

尝试此命令:

for i in *
do
    head -n 50 $i | grep -H --label=$i pattern
done

输出:

1.txt: aaaaaaaa pattern aaaaaaaa
2.txt: bbbb pattern bbbbb

答案 3 :(得分:0)

ls *.txt | xargs head -<N lines>| grep 'your_string'