仅显示grep的第n个匹配项

时间:2013-02-28 12:20:24

标签: bash grep pattern-matching match

onefish
onechicken
twofish
twochicken
twocows
threechicken

如果我想grep包含“two”的行怎么办,但我只想要第二场比赛。所以我希望结果“twochicken”。

5 个答案:

答案 0 :(得分:27)

试试这个:

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

答案 1 :(得分:19)

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

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

答案 2 :(得分:3)

grep和sed可用于过滤行号。

测试文件

addq    $16, %rsp

获取所需的行:

onefish
onechicken
twofish
twochicken
threechicken
twocows

答案 3 :(得分:1)

如果单词(此处为单词== 2)在一行中重复多次,&如果要打印该行,请使用以下内容:

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

e.g。 对于以下输入:

onefish
onechicken
twotwofish
twochicken
twocows
threechicken

它将打印twotwofish,而不是twochicken

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

答案 4 :(得分:1)

应该注意的是,如果交换threechickentwocows行,又称:

onefish
onechicken
twofish
twochicken
threechicken
twocows
然后肯特的第一个回复(awk '/two/{i++}i==2' file)将产生输出:

twochicken
threechicken

因为再次出现匹配会增加计数器。他的最后回复:awk '/two/{i++}i==2{print; exit}' file避免了这个问题。