2013-02-28 142 views
20
onefish 
onechicken 
twofish 
twochicken 
twocows 
threechicken 

如果我想grep包含“two”的行,但我只想要第二个匹配,该怎么办。所以我想要结果“twochicken”。只显示grep的第n个匹配

回答

23

试试这个:

awk '/two/{i++}i==2' file 

与您的数据:

kent$ echo "onefish 
onechicken 
twofish 
twochicken 
twocows 
threechicken"|awk '/two/{i++}i==2' 
twochicken 

:如果你的文件是巨大的,这样做:

awk '/two/{i++}i==2{print; exit}' file 
+0

第二个选项是优于文件大小,不是? – poncha 2013-02-28 12:27:18

+0

@poncha,行号 – Kent 2013-02-28 12:31:40

+0

你是什么意思的'行号'?我的意思是加入'{print;退出}'是任何输入大小的好主意......哦。这实际上是选项#3;)我算错了))) – poncha 2013-02-28 12:35:25

17
grep -m2 "two" in-file.txt | tail -n1 

停止第二场比赛后,再打印第二行。

+1

这并不完全符合预期。如果有多于两个的匹配,它将输出多行... – poncha 2013-02-28 12:34:01

+0

尾部应该是:'tail -n1'。 – Thor 2013-02-28 13:01:54

+0

@poncha:真的吗? grep -m2确保只有两个匹配。无论如何,我改变了它,尽管我认为之前可以。 – 2013-02-28 14:29:31

0

如果字(这里word == two)在单行中重复多次,&要打印t该线,使用如下:

word=two 
n=2 
line=`grep -m$n $word -o -n MyFile | sed -n $n's/:.*//p'` 
awk 'FNR=='$line'{print; exit}' MyFile 

例如, 对于下面输入:

onefish 
onechicken 
twotwofish 
twochicken 
twocows 
threechicken 

将打印twotwofish,而不是twochicken

这可能不是user1787038想要的,但添加回答我自己的评论。

+0

grep行中的'-m $ n'只是为了一些优化,不是功能需要的。 – anishsane 2013-02-28 15:05:42

1

应当注意的是,如果threechickentwocows线进行交换,又名:

onefish 
onechicken 
twofish 
twochicken 
threechicken 
twocows 

然后肯特的第一反应(awk '/two/{i++}i==2' file)将产生输出:

twochicken 
threechicken 

,因为它需要另一发生匹配以增加计数器。他的最后回应:awk '/two/{i++}i==2{print; exit}' file避免了这个问题。