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

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

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

答案1

还有两个选择:

awk

awk '{if ($0~"pattern") print $0; nextfile;}' mydir/*

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

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

在切换到下一个文件之前将只读取第一行,并且仅在匹配时才打印它"pattern"

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

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

使用head,保留文件名

head -n1 -v mydir/files*|grep -B1 pattern

-v选项head将打印文件名,选项-B1grep打印匹配行的上一行 - 即文件名。如果您只需要文件名,您可以将其进一步通过管道传输到grep :

head -n1 -v mydir/*|grep -B1 pattern|grep ==>

正如 don_crissti 在评论中注意到的那样,请注意与模式本身匹配的文件名,但是……

答案2

使用 GNU grep

grep -m1 ^ * |grep 'pattern'

递归地:

grep -rm1 ^ . |grep 'pattern'

答案3

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

替换string为您的字符串。

grep -Rin "string" . | grep ":1:.*string" > result.txt

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

答案4

我们也可以尝试使用 sed 命令

sed -n '1p' filename| sed -n '/pattern/p'

相关内容