如何只显示匹配后的下一行?

grep -A1 'blah' logfile

多亏了这个命令,对于每一行中包含“ ba”的行,我得到了包含“ ba”的行和日志文件后面的下一行的输出。这可能是一个简单的问题,但是我找不到一种方法来省略在输出中包含“ Blab”和 只有显示下一行的行。

304672 次浏览

您可以尝试使用awk:

awk '/blah/{getline; print}' logfile

我不知道有什么方法可以用grep来做到这一点,但是使用awk可以达到相同的结果:

awk '/blah/ {getline;print}' < logfile

如果你想坚持使用grep:

grep -A1 'blah' logfile | grep -v "blah"

或者使用sed:

sed -n '/blah/{n;p;}' logfile

看来你用错工具了。Grep并没有那么复杂,我认为你想要提升awk作为这项工作的工具:

awk '/blah/ { getline; print $0 }' logfile

如果你有任何问题让我知道,我认为它很值得学习一点awk,它是一个伟大的工具:)

< p >注。这个例子没有获得“无用的猫奖”;) http://porkmail.org/era/unix/award.html < / p >

如果下一行从来没有包含'blah',你可以过滤他们:

grep -A1 blah logfile | grep -v blah

不需要使用cat logfile | ...

滚边是你的朋友……

使用grep -A1来显示匹配后的下一行,然后将结果传递给tail,只抓取一行,

cat logs/info.log | grep "term" -A1 | tail -n 1

reaim的回答很好,对我很有用。将其扩展到打印模式之后的第7行是很简单的

awk -v lines=7 '/blah/ {for(i=lines;i;--i)getline; print $0 }' logfile

总的来说,我同意您在这里要求使用大量grep,而另一种工具可能是更好的解决方案。但在嵌入式环境中,我可能不希望使用sedawk来完成此操作。我发现以下解决方案是有效的(只要它们不是连续的匹配):

grep -A1 AT\+CSQ wvdial.out | grep -v AT\+CSQ

基本上,匹配它们,为每个匹配附加一行上下文,然后通过原始模式的反向匹配来将它们剥离出来。当然,这意味着您可以假设您的模式不会出现在“下一行”中。

到目前为止,这个问题已经给出了许多很好的答案,但我仍然错过了一个awk没有使用getline的答案。由于,在一般情况下,没有必要使用getline,我将使用:

awk ' f && NR==f+1; /blah/ {f=NR}' file  #all matches after "blah"

awk '/blah/ {f=NR} f && NR==f+1' file   #matches after "blah" not being also "blah"

逻辑总是包含在存储"blah"然后打印后面一行的那些行。

测试

示例文件:

$ cat a
0
blah1
1
2
3
blah2
4
5
6
blah3
blah4
7

取“blah"”后面的所有行。这将打印另一个“blah"如果它出现在第一个之后。

$ awk 'f&&NR==f+1; /blah/ {f=NR}' a
1
4
blah4
7

得到“blah”后面的所有行;如果他们不包含“blah"他们自己。

$ awk '/blah/ {f=NR} f && NR==f+1' a
1
4
7

Perl一行程序警告

只是为了好玩……匹配后只打印一行

perl -lne '$. == $next && print; $next = ($.+1) if /match/' data.txt

更有趣的是……匹配后打印接下来的十行

perl -lne 'push @nexts, (($.+1)..($.+10)) if /match/; $. ~~ @nexts && print' data.txt

虽然有点作弊,因为实际上有两个命令

grep /Pattern/ | tail -n 2 | head -n

尾先2个,头最后一个,比赛结束后正好排在第一行。

你可以使用grep,然后在跳跃中取行:
grep -A1 'blah' logfile | awk 'NR%3==2' < br >
你也可以在匹配后取n行,例如:
seq 100 | grep -A3 .2 | awk 'NR%5==4' < br > 15 < br > 25 < br > 35 < br > 45 < br > 55 < br > 65年< br > 75年< br > 85年< br > 95年< br > 解释-
这里我们想要grep所有*2的行,并在它之后取3行,即*5 seq 100 | grep -A3 .2将给你:
12 < br > 13 < br > 14 < br > 15 < br > ——< br > 22日< br > 23日< br > 24 < br > 25 < br > ——< br > < br >… 模数(NR%5)中的数字是grep添加的行数(这里是3乘标记-A3), +2额外的行,因为您有当前匹配的行,以及grep添加的——行

你可以匹配多行,然后输出n行:

awk 'c&&!--c;/match1/{c=1};/match2/{c=2}' file

匹配多个项目,输出n行后:

#!/bin/sh
[ -z $3 ] && echo $0 file \[match n\]+... \# to output line n after match && exit
f=$1; shift; while [ \! -z $2 ]; do s="$s/$1/{c=$2};"; shift; shift; done
awk 'c&&!--c;'$s $f

所以你可以将上面的文件保存为matchn.shchmod +x matchn.sh,然后如果你有一个这样的文件:

line1
line2
line3
line4
line5
line6
line7

并运行:

./matchn.sh file line1 1 line3 2 line6 1

你会得到:

line2
line5
line7

这将需要更多的调整来支持0偏移量。