我可以只grep文件的前n行吗?

时间:2012-01-06 18:01:16

标签: bash search grep

我有很长的日志文件,是否可以要求grep只搜索前10行?

12 个答案:

答案 0 :(得分:145)

管道的魔力;

head -10 log.txt | grep <whatever>

答案 1 :(得分:42)

对于在Google上找到此内容的人,我需要搜索多个文件的第一行n行,但只打印匹配的文件名。我用了

 gawk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' filenames

FNR..nextfile一旦看到10行就停止处理文件。 //..{}打印文件名,并在给定文件中的第一个匹配项出现时继续运行。要引用文件名以获得其他程序的好处,请使用

 gawk 'FNR>10 {nextfile} /pattern/ { print "\"" FILENAME "\"" ; nextfile }' filenames

答案 2 :(得分:23)

或者使用awk来处理没有|的单个流程:

awk '/your_regexp/ && NR < 11' INPUTFILE

在每一行上,如果your_regexp匹配,且记录数(行数)小于11,则执行默认操作(打印输入行)。

或使用sed

sed -n '/your_regexp/p;10q' INPUTFILE 

检查正则表达式并打印行(-n表示不打印输入,否则为默认值),并在第10行之后退出。

答案 3 :(得分:8)

您可以使用程序和grep一些选项。我认为最简单的方法是使用head

head -n10 filename | grep ...

head将输出前10行(使用-n选项),然后您可以将该输出传递给grep

答案 4 :(得分:4)

grep "pattern" <(head -n 10 filename)

答案 5 :(得分:2)

head -10 file的输出可以通过管道传输到grep,以实现此目的:

head -10 file | grep …

使用Perl:

perl -ne 'last if $. > 10; print if /pattern/' file

答案 6 :(得分:2)

您可以使用以下行:

head -n 10 /path/to/file | grep [...]

答案 7 :(得分:2)

head -10 log.txt | grep -A 2 -B 2 pattern_to_search

-A 2:在模式前打印两行。

-B 2:在模式后打印两行。

head -10 log.txt # read the first 10 lines of the file.

答案 8 :(得分:2)

grep -m6 "string" cov.txt

这仅在前6行中搜索string

答案 9 :(得分:1)

Joachim Isaksson的答案的答案:我常常需要从长文件的中间找到一些东西,例如:第5001行到第5020行,在这种情况下,您可以将headtail合并:

head -5020 file.txt | tail -20 | grep x

这会获得前5020行,然后只显示其中的最后20行,然后将所有内容输送到grep。

(编辑:我的示例数字中的fencepost错误,向grep添加了管道)

答案 10 :(得分:0)

我遇到了类似的问题,所有上述问题都没有完全解决。我也有兴趣获取包含匹配行的文件名。 我的解决方案:

ls |parallel --gnu 'cat <(echo {}) <(head {})|grep -B1 -m1 -P "^>.*F3$"'

N.B:我案例中的模式总是与第一行匹配。

答案 11 :(得分:-1)

grep -A 10&lt; Pattern&gt;

这是在模式之后抓取模式和接下来的10行。如果没有已知模式使用“头部”建议,这对于已知模式很有效。