onefish
onechicken
twofish
twochicken
twocows
threechicken
如果我想要使用grep查找包含“two”的行,但我只想要第二个匹配。因此,我希望结果是“twochicken”。
onefish
onechicken
twofish
twochicken
twocows
threechicken
如果我想要使用grep查找包含“two”的行,但我只想要第二个匹配。因此,我希望结果是“twochicken”。
grep -m2 "two" in-file.txt | tail -n1
试试这个:
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
/two/{A} i==2 {B}
= if($0~/two) do A; if(i==2) do B
=>@ManuelJordan /two/{A} i==2 {B}
= 如果($0匹配/two)执行A;如果i等于2,执行B
- Kentgrep和sed可用于过滤行号。
testfile:
onefish
onechicken
twofish
twochicken
threechicken
twocows
获取所需行:
grep "two" testfile | sed -n 2p
prints "twochicken"
grep "two" testfile | sed -n 1p
prints "twofish"
grep
命令查找第n个匹配项,我们可以使用head
和tail
命令的组合方式,像这样:grep two file.txt | head -n1 | tail -1
这里的n1
是我们需要的第n个匹配项。
threechicken
和twocows
这两行,也就是:onefish
onechicken
twofish
twochicken
threechicken
twocows
那么肯特的第一个回应 (awk '/two/{i++}i==2' file
) 将产生以下输出:
twochicken
threechicken
由于需要另一次匹配才能增加计数器,因此这会导致问题。他的最后回应:awk '/two/{i++}i==2{print; exit}' file
避免了这个问题。
如果一行文字中重复出现了某个单词(此处指word==two),且您希望打印该行文字,请使用以下代码:
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. For below input:
onefish
onechicken
twotwofish
twochicken
twocows
threechicken
它将打印twotwofish
,而不是twochicken
。
这可能不是用户1787038想要的,但是我添加了回答我的评论。
-m$n
只是为了一些优化而已,对功能来说并不必需。 - anishsane这个问题与grep有关,所以让我们继续使用它:
$ cat testfile
onefish
onechicken
twofish
twochicken
twocows
threechicken
$ grep two testfile | while read line; do
((n++))
((n==2)) && { echo "$line"; break; }
done
twochicken
tail -n1
。 - Thor-A
或-B
结合使用)。然而,其他任何替代方案也都无法处理多行匹配。 - Chiarcos