如何使用 grep 仅在文件的第一行搜索特定字符串?

Mic*_*ter 5 linux grep search

如何使用 grep 在文件中查找字符串,但只搜索这些文件的第一行?

Ski*_*rou 10

还有两个选择:

awk

awk '{if ($0~"pattern") print $0; nextfile;}' mydir/*
Run Code Online (Sandbox Code Playgroud)

或者如果您的awk版本不支持nextfile(感谢 Stéphane Chazelas 的建议):

awk 'FNR==1{if ($0~"pattern") print $0;}' mydir/*
Run Code Online (Sandbox Code Playgroud)

将在切换到下一个文件之前仅读取第一行,并仅在匹配"pattern".

优点是可以微调要搜索模式$2的字段(例如仅使用搜索第二个字段)和输出(例如$3打印第三个字段FILENAME,或什至混合)。

请注意,使用FNR(“当前输入记录号”,即行号)版本,您可以进一步微调您想要 grep 的行:FNR==3对于第三行,FNR<10对于前 10 行,等等(我猜测在这种情况下,如果您正在处理非常大的文件并且您的awk版本支持它,您可能希望混合FNR使用nextfile以提高性能。)

使用head,保留文件名

head -n1 -v mydir/files*|grep -B1 pattern
Run Code Online (Sandbox Code Playgroud)

-voption ofhead将打印文件名,option -B1ofgrep将打印匹配行的前一行 - 即文件名。如果您只需要文件名,您可以通过管道将其进一步传输到grep :

head -n1 -v mydir/*|grep -B1 pattern|grep ==>
Run Code Online (Sandbox Code Playgroud)

正如 don_crissti 在评论中所注意到的,请注意与模式本身匹配的文件名,不过……


Mic*_*ter 2

我已经实现了@Rob的评论并成功获得了预期的结果。

替换string为您的字符串。

grep -Rin "string" . | grep ":1:.*string" > result.txt
Run Code Online (Sandbox Code Playgroud)

这会在当前目录中进行不区分大小写的递归搜索string并打印行号。然后它在文件中搜索第 1 行的匹配项,并将输出保存到名为 的文件中result.txt

  • 这也将找到“:1:”恰好出现在“string”之前的任何行,无论那是哪一行。例如,一行内容为“This is it:1:st string!”。 (2认同)