it-swarm.cn

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

grep -A1 'blah' logfile

感谢这个命令对于每个包含'blah'的行,我得到包含'blah'的行的输出以及日志文件中的下一行。它可能是一个简单的但我无法找到一种方法来省略具有'blah'和 only 在输出中显示下一行的行。

186
facha

你可以试试awk:

awk '/blah/{getline; print}' logfile
164
Michał Šrajer

如果你想坚持grep:

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

要么

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

管道是你的朋友......

使用grep -A1显示匹配后的下一行,然后将结果传递给tail并仅获取1行,

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

来自raim的好回答,对我来说非常有用。将其扩展到打印例如是微不足道的。第7行后的模式

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

一般来说,我同意你在这里问了很多grep,而另一个工具可能是更好的解决方案。但是在嵌入式环境中,我可能不希望只有sedawk来执行此操作。我发现以下解决方案有效(只要它们不是连续的匹配):

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

基本上,匹配它们,为每个匹配附加1行上下文,然后通过原始模式的反向匹配来管理它以去除它们。这当然意味着您可以假设您的模式没有显示在“下一行”行中。

5
Travis Griggs

到目前为止,这个问题已经给出了许多好的答案,但我仍然错过了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”。

$ 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
5
fedorqui

Perl单线警报

只是为了好玩...比赛后只打印一行

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

更有趣......比赛后打印下十行

Perl -lne '[email protected],(($.+1)..($.+10))if/match/;[email protected]&&print' data.txt

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

4
beasy

我不知道用grep做任何方法,但是可以使用awk来实现相同的结果:

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

看起来你在那里使用了错误的工具。 Grep并不那么复杂,我想你想要把awk作为工作的工具:

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

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

附:这个例子没有赢得“无用的猫奖”;) http://porkmail.org/era/unix/award.html

3
sillyMunky

如果下一行永远不会包含'blah',您可以使用以下方法过滤它们:

grep -A1 blah logfile | grep -v blah

不需要使用cat logfile | ...

3
ott--