最好通过一个假设的例子来描述使用:
在大量电子邮件存储中搜索一些有用的标题信息(每封电子邮件在一个单独的文件中)。例如,统计使用的顶级邮件客户端应用程序。
通常,如果您执行 grep 您可以指定 -m 在第一次匹配时停止,但假设电子邮件不联系 X-Mailer 或我们在标题中寻找的任何内容?它将扫描整个电子邮件。由于大多数标题都小于 50 行,因此可以通过告诉 grep 在任何文件上仅搜索 50 行来提高性能。我找不到办法做到这一点。
我不知道它是否会更快,但你可以用 awk 做到这一点:
awk '/match me/{print;exit}FNR>50{exit}' *.mail
match me
如果它出现在前 50 行中,将打印第一行匹配。(如果您还想打印文件名,grep 样式,更改print;
为print FILENAME ":" $0;
)
awk
没有任何等效于grep
'-r
标志,但如果您需要递归扫描目录,您可以使用find
with -exec
:
find /base/dir -iname '*.mail' \
-exec awk '/match me/{print FILENAME ":" $0;exit}FNR>50{exit}' {} +
head -n50
您可以通过管道解决此问题,grep
但这无疑会更慢,因为您必须为每个文件启动两个新进程(一个head
和一个)。grep
您可以只用一个head
和一个来完成,grep
但是一旦找到魔法线,您就会失去停止匹配文件的能力,并且用文件名标记这些行会很尴尬。
你可以做这样的事情
head -50 <mailfile>| grep <your keyword>
试试这个命令:
for i in *
do
head -n 50 $i | grep -H --label=$i pattern
done
1.txt: aaaaaaaa pattern aaaaaaaa
2.txt: bbbb pattern bbbbb
ls *.txt | xargs head -<N lines>| grep 'your_string'