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

时间:2011-09-16 23:44:02

标签: awk sed grep

grep -A1 'blah' logfile

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

12 个答案:

答案 0 :(得分:166)

你可以试试awk:

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

答案 1 :(得分:131)

如果你想坚持grep:

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

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

答案 2 :(得分:27)

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

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

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

答案 3 :(得分:13)

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

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

答案 4 :(得分:5)

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

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

基本上,匹配它们,为每个匹配附加1行上下文,然后通过原始模式的反向匹配来管道它以去掉那些。这当然意味着你可以假设你的模式并没有出现在" next"线。

答案 5 :(得分:5)

到目前为止,我们已经对这个问题给出了很多好的答案,但我仍然怀念rootradicand(handleradicand(a,b,c)); 未使用awk的问题。由于in general没有必要使用getline,我会选择:

getline

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

逻辑始终在于将行存储在" blah"找到然后打印之后一行的那些行。

测试

示例文件:

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

在" 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

答案 6 :(得分:4)

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

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

答案 7 :(得分:4)

perl one-liner alert

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

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

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

perl -lne 'push@nexts,(($.+1)..($.+10))if/match/;$.~~@nexts&&print' data.txt
有点作弊,因为实际上有两个命令

答案 8 :(得分:3)

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

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

如果您遇到任何问题请告诉我,我认为非常值得学习一些awk,它是一个很棒的工具:)

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

答案 9 :(得分:3)

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

grep -A1 blah logfile | grep -v blah

不需要使用cat logfile | ...

答案 10 :(得分:0)

grep /模式/ |尾-n 2 |头-n 1

尾巴先排2,然后排头尾以在比赛后获得第一行。

答案 11 :(得分:0)

您可以使用grep,然后跳行:
grep -A1 'blah' logfile | awk 'NR%3==2'

您也可以在比赛后加入n行,例如:
seq 100 | grep -A3 .2 | awk 'NR%5==4'
15
25
35
45
55
65
75
85
95
说明-
在这里我们要grep所有* 2的行,并在其后乘3行,即* 5。
seq 100 | grep -A3 .2将给您:
12
13
14
15
-
22
23
24
25
-
...
模(NR%5)中的数字是grep所添加的行(这里是标志-A3为3),另外+2行,因为您具有当前匹配行以及grep要添加的-行。 br />