grep -A1 'blah' logfile
感谢这个命令对于每个包含'blah'的行,我得到包含'blah'的行的输出以及日志文件中的下一行。这可能是一个简单的但我无法找到一种方法来省略“blah”和仅在输出中显示下一行的行。
答案 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,而另一个工具可能是更好的解决方案。但是在嵌入式环境中,我可能不希望sed
或awk
这样做。我发现以下解决方案有效(只要它们不是连续匹配):
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 />