grep -A1 'blah' logfile
多亏了此命令,每行中都有'blah'的行,我得到了包含'blah'的行以及日志文件中下一行的输出。这可能很简单,但是我找不到一种方法来省略具有“ blah”的行,而仅在输出中显示下一行。
curl whatismyip.org | grep -A1 'Your IP Address'
-A1
。谢谢!
grep -A1 'blah' logfile
多亏了此命令,每行中都有'blah'的行,我得到了包含'blah'的行以及日志文件中下一行的输出。这可能很简单,但是我找不到一种方法来省略具有“ blah”的行,而仅在输出中显示下一行。
curl whatismyip.org | grep -A1 'Your IP Address'
-A1
。谢谢!
Answers:
您可以尝试使用awk:
awk '/blah/{getline; print}' logfile
awk '/blah/{getline; getline; print}' logfile
如果您想坚持使用grep:
grep -A1 'blah' logfile|grep -v "blah"
要么
sed -n '/blah/{n;p;}' logfile
到目前为止,已经对该问题给出了许多很好的答案,但是我仍然awk
没有使用,所以很想念它getline
。由于通常不需要使用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
Perl一线警报
只是为了好玩...赛后只打印一行
perl -lne '$next=($.+1)if/match/;$.==$next&&print' data.txt
更加有趣...比赛后再打印下十行
perl -lne 'push@nexts,(($.+1)..($.+10))if/match/;$.~~@nexts&&print' data.txt
有点作弊,因为实际上有两个命令
$. == $next && print
与print if $. == $next
grep -A1
)。如果只想打印下一行,而不要打印匹配的行,则可以按此顺序打印。(只是指出在连续比赛中如何破坏$ next)
好像您在使用错误的工具。Grep并不是那么复杂,我想您想成为awk的工具:
awk '/blah/ { getline; print $0 }' logfile
如果您遇到任何问题,请告诉我,我认为值得学习awk,它是一个很好的工具:)
ps此示例不会赢得“猫奖的无用使用”;) http://porkmail.org/era/unix/award.html
grep /模式/ | 尾-n 2 | 头-n 1
尾巴先尾2,然后最后尾巴,以在比赛后获得准确的第一行。
-A1
选择