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)
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)
wei*_*ohn 29
管道是你的朋友......
用于grep -A1在匹配后显示下一行,然后将结果传递给tail并且只抓取1行,
cat logs/info.log | grep "term" -A1 | tail -n 1
Run Code Online (Sandbox Code Playgroud)
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)
如果下一行从不包含“ blah”,则可以使用以下方法过滤它们:
grep -A1 blah logfile | grep -v blah
Run Code Online (Sandbox Code Playgroud)
使用的cat logfile | ...是没有必要的。
我不知道用grep做到这一点的任何方法,但是可以使用awk达到相同的结果:
awk '/blah/ {getline;print}' < logfile
Run Code Online (Sandbox Code Playgroud)
一般来说,我同意你在这里问了很多grep,而另一个工具可能是更好的解决方案.但是在嵌入式环境中,我可能不想拥有sed或awk只是为了这样做.我发现以下解决方案有效(只要它们不是连续的匹配):
grep -A1 AT\+CSQ wvdial.out | grep -v AT\+CSQ
Run Code Online (Sandbox Code Playgroud)
基本上,匹配它们,为每个匹配附加1行上下文,然后通过原始模式的反向匹配来管理它以去除它们.这当然意味着您可以假设您的模式没有显示在"下一行"行中.
到目前为止,这个问题已经得到了许多好的答案,但我仍然想念一个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)