2

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

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

通常,如果您执行 grep 您可以指定 -m 在第一次匹配时停止,但假设电子邮件不联系 X-Mailer 或我们在标题中寻找的任何内容?它将扫描整个电子邮件。由于大多数标题都小于 50 行,因此可以通过告诉 grep 在任何文件上仅搜索 50 行来提高性能。我找不到办法做到这一点。

4

4 回答 4

2

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

 awk '/match me/{print;exit}FNR>50{exit}' *.mail

match me如果它出现在前 50 行中,将打印第一行匹配。(如果您还想打印文件名,grep 样式,更改print;print FILENAME ":" $0;

awk没有任何等效于grep'-r标志,但如果您需要递归扫描目录,您可以使用findwith -exec

find /base/dir -iname '*.mail' \
     -exec awk '/match me/{print FILENAME ":" $0;exit}FNR>50{exit}' {} +

head -n50您可以通过管道解决此问题,grep但这无疑会更慢,因为您必须为每个文件启动两个新进程(一个head和一个)。grep您可以只用一个head和一个来完成,grep但是一旦找到魔法线,您就会失去停止匹配文件的能力,并且用文件名标记这些行会很尴尬。

于 2013-07-05T02:54:54.347 回答
1

你可以做这样的事情

head -50 <mailfile>| grep <your keyword>
于 2013-07-05T02:55:00.847 回答
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
于 2013-07-05T02:56:23.997 回答
0
ls *.txt | xargs head -<N lines>| grep 'your_string'
于 2013-07-05T05:23:20.593 回答