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

fac*_*cha 204 awk grep sed

grep -A1 'blah' logfile
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*jer 175

你可以试试awk:

awk '/blah/{getline; print}' logfile
Run Code Online (Sandbox Code Playgroud)

  • 警告:假设您没有得到两条相邻的匹配线 (3认同)
  • 对于真正想要grep -A2等效项的人(这是我所需要的),getline会吃掉该行,然后继续执行下一个。所以实际上对我有用的只是'awk'/ blah / {getline; getline; 打印}'日志文件` (2认同)

Ken*_*ent 146

如果你想坚持grep:

grep -A1 'blah' logfile|grep -v "blah"
Run Code Online (Sandbox Code Playgroud)

要么

sed -n '/blah/{n;p;}' logfile
Run Code Online (Sandbox Code Playgroud)

  • sed是最好的答案.awk w/getline一般都有效,但它的工具错误,可能会让你意外地咬人,[http://awk.info/?tip/getline](http://awk.info/?tip/getline) (5认同)
  • @肯特,谢谢你的提示。从我的观点来看,与sed或标记为最佳答案的awk答案相比,grep更具可读性和易掌握性。...但这也许只是我自己:) (2认同)
  • 对于那些对-v做什么很好奇的人:-v --invert-match反转匹配感,选择不匹配的行.(-v由POSIX指定.) (2认同)
  • 我真的很喜欢这个答案,但是如果您连续有两行包含“ blah”并且想要获取第二行(因为它是“匹配的行之后的下一行”),它将无法正常工作。我想不出什么用例,但是值得注意。 (2认同)

wei*_*ohn 29

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

用于grep -A1在匹配后显示下一行,然后将结果传递给tail并且只抓取1行,

cat logs/info.log | grep "term" -A1 | tail -n 1
Run Code Online (Sandbox Code Playgroud)

  • 如果您有多个匹配项,则无效. (39认同)
  • tail -n 1 只会产生整个文件的最后一行 (4认同)

sou*_*ter 13

来自raim的好回答,对我来说非常有用.将其扩展为在图案之后打印例如第7行是微不足道的

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


ott*_*t-- 6

如果下一行从不包含“ blah”,则可以使用以下方法过滤它们:

grep -A1 blah logfile | grep -v blah
Run Code Online (Sandbox Code Playgroud)

使用的cat logfile | ...是没有必要的。


rai*_*mue 5

我不知道用grep做到这一点的任何方法,但是可以使用awk达到相同的结果:

awk '/blah/ {getline;print}' < logfile
Run Code Online (Sandbox Code Playgroud)


Tra*_*ggs 5

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

grep -A1 AT\+CSQ wvdial.out | grep -v AT\+CSQ
Run Code Online (Sandbox Code Playgroud)

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


fed*_*qui 5

到目前为止,这个问题已经得到了许多好的答案,但我仍然想念一个awk没有使用的问题getline.因为,一般来说,没有必要使用getline,我会去:

awk ' f && NR==f+1; /blah/ {f=NR}' file  #all matches after "blah"
Run Code Online (Sandbox Code Playgroud)

要么

awk '/blah/ {f=NR} f && NR==f+1' file   #matches after "blah" not being also "blah"
Run Code Online (Sandbox Code Playgroud)

逻辑总是在于存储找到"blah"的行,然后打印后面一行的那些行.

测试

样本文件:

$ cat a
0
blah1
1
2
3
blah2
4
5
6
blah3
blah4
7
Run Code Online (Sandbox Code Playgroud)

在"等等"之后获取所有行.如果它出现在第一个之后,则打印另一个"blah".

$ awk 'f&&NR==f+1; /blah/ {f=NR}' a
1
4
blah4
7
Run Code Online (Sandbox Code Playgroud)

如果他们自己不包含"blah",请在"blah"之后获取所有行.

$ awk '/blah/ {f=NR} f && NR==f+1' a
1
4
7
Run Code Online (Sandbox Code Playgroud)