grep -A1 'blah' logfile
感谢这个命令,对于每一行中包含“blah”的日志文件,我都得到了包含“blah”和其后一行的输出。虽然很简单,但我找不到一种方法来省略包含“blah”的那一行,并且仅仅在输出中显示下一行。
你可以尝试使用awk:
awk '/blah/{getline; print}' logfile
awk '/blah/{getline; getline; print}' logfile
。 - Aaron R.如果你想坚持使用grep:
grep -A1 'blah' logfile | grep -v "blah"
或者可以使用sed:
sed -n '/blah/{n;p;}' logfile
管道是你的好伙伴...
使用grep -A1
命令显示匹配行的下一行,然后将结果传输到tail
并且只获取一行。
cat logs/info.log | grep "term" -A1 | tail -n 1
raim的回答非常好,对我很有用。将其扩展以在模式后打印第7行等内容非常简单。
awk -v lines=7 '/blah/ {for(i=lines;i;--i)getline; print $0 }' logfile
迄今为止,已经有很多好的答案给出了这个问题,但是我仍然想要一个不使用 getline
的 awk
答案。因为,通常情况下,不必使用 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”之后再次出现,则会打印另一个“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
如果下一行没有包含“blah”,您可以使用以下方式过滤它们:
grep -A1 blah logfile | grep -v blah
不需要使用cat logfile | ...
。
<logfile grep -A1 blah | grep -v blah
。这是完全有效的BASH命令! - anthony我不知道在grep中有任何方法可以做到这一点,但是可以使用awk来实现相同的结果:
awk '/blah/ {getline;print}' < logfile
总的来说,我同意这里对grep的要求很高,另外一种工具可能更好。但是在嵌入式环境中,我可能不想使用sed或awk来完成这个任务。我发现以下解决方案可以解决问题(只要它们不是连续匹配):
grep -A1 AT\+CSQ wvdial.out | grep -v AT\+CSQ
Perl一行代码告警
只是为了好玩...在匹配后只打印一行
perl -lne '$. == $next && print; $next = ($.+1) if /match/' data.txt
perl -lne 'push @nexts, (($.+1)..($.+10)) if /match/; $. ~~ @nexts && print' data.txt
有点作弊,因为实际上有两个命令
$. == $next && print
与print if $. == $next
是相同的。 - beasygrep -A1
)。如果您只想打印下一行,但从不与匹配行一起打印,则应保留此顺序。(只是注意连续匹配会如何破坏 $next) - Keith Bentrupawk '/blah/ { getline; print $0 }' logfile
如果出现任何问题,请告诉我,我认为学习一些awk非常值得,它是一个很棒的工具 :)
curl whatismyip.org | grep -A1 'Your IP Address'
- shrekuu