如何使用 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
版本支持它,您可能需要混合FNR
以nextfile
提高性能。)
使用head
,保留文件名
head -n1 -v mydir/files*|grep -B1 pattern
-v
选项head
将打印文件名,选项-B1
将grep
打印匹配行的上一行 - 即文件名。如果您只需要文件名,您可以将其进一步通过管道传输到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'