我可以仅对文件的前n行进行grep吗?


Answers:



49

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

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

FNR..nextfile一旦看到10行,就会停止处理文件。该//..{}上打印的文件名和移动,每当在给定的文件显示了第一场比赛。要引用文件名以利于其他程序,请使用

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

9
我是在Google上发现此问题的人之一。谢谢!
Floris 2013年

对我来说,这段代码打印出了文件的完整路径。这正是我所需要的。也FNR=1只会搜索第一行。谢谢!
布赖恩W

2
要在目录上递归执行此操作:find ./path -type -f -exec awk 'FNR>10 {nextfile} /pattern/ { print FILENAME ; nextfile }' '{}' +
OrangeDog

1
谢谢@OrangeDog。稍作更正:应该是-type f
David Siegal

26

awk用于单个过程,而无需|

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

在每行上,如果your_regexp匹配,并且记录(行)数少于11,它将执行默认操作(正在打印输入行)。

或使用 sed

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

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


1
为什么不于10日退出?(请参见sed解决方案)
potong 2012年

awk '{ if ( NR <= 10 ) { if(index($0,"ab") > 0) { print $0; } } else { exit; } }' textfile - 快点。

1
@potong你是正确的,纠正了。@srikanthradix虽然可以更快地解决,但它不是在搜索正则表达式,而是在搜索固定字符串。awk '{ if ( NR <= 10 ) { if( $0 ~ "YOUR_REGEXP") { print } } else { exit; } }' textfile做。
Zsolt Botykai,2012年

4
再加上样式不是awkish2xifs并且1xelse在不需要动作语句的命令中会产生错误。温伯格和克尼根大哭……
杰帕尔·辛格

1
我认为,使用NR而不是NR会更好,因为如果您将awk与多个文件一起使用,则每个文件的FNR从0开始。
弗拉迪斯拉夫·萨夫琴科

9

与一起使用程序,您有几种选择grep。我认为最简单的方法是使用head

head -n10 filename | grep ...

head将输出前10行(使用该-n选项),然后您可以将该输出通过管道传输到grep


6
我甚至没有意识到,这里使用的所有解决方案head都采用-n 10 (包括我在内)没有意识到,head默认显示只有10行。:)
jaypal singh 2012年



3

head -10 file可以通过管道将其输出grep以完成此操作:

head -10 file | grep 

使用Perl:

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

3
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.

1
如果我还记得的话,-C 2将与-A 2 -B 2
David LeBauer


2

Joachim Isaksson的答案的扩展:通常,我需要长文件中间的内容,例如5001到5020行,在这种情况下,您可以结合head使用tail

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

这将获得前5020行,然后仅显示其中的最后20行,然后将所有内容通过管道传输到grep。

(编辑:我的示例编号中的fencepost错误,已将管道添加到grep)


1

grep -A 10 <模式>

这是抓取图案以及图案之后的下10行。这仅适用于已知模式,如果您没有已知模式,请使用“ head”建议。


1
虽然可能正确。添加更多问题描述以使答案更全面。
Pramod S. Nikam 2014年

3
这回答了一个完全不同的问题,在这种情况下没有用。
Pre101 '18 -10-18

-1

我有一个类似的问题,上述所有问题都不能完全解决。我也对获取包含匹配行的文件名感兴趣。我的解决方案:

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

注意:就我而言,模式始终与第一行匹配。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.