grep -A1 'blah' logfile

多亏了这个命令,每一行都有'blah',我得到了包含'blah'的行输出和日志文件中的下一行。这可能是一个简单的,但我找不到一种方法来省略一行有'blah',只显示下一行在输出。


当前回答

如果你想坚持使用grep:

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

或者使用sed:

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

其他回答

您可以尝试使用awk:

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

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

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

滚边是你的朋友……

使用grep -A1显示匹配后的下一行,然后将结果管道到tail,只抓取一行,

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

你可以匹配多行,然后输出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

所以你可以把上面的文件保存为match .sh和chmod +x match .sh,然后如果你有一个这样的文件:

line1
line2 
line3
line4
line5
line6
line7

并运行:

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

你会得到:

line2
line5
line7

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

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

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

or

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

逻辑始终包括存储找到“blah”的行,然后打印后面一行的行。

Test

示例文件:

$ 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