grep -A1 'blah' logfile

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


当前回答

如果下一行从来没有包含'blah',你可以过滤他们:

grep -A1 blah logfile | grep -v blah

使用cat logfile |…不需要。

其他回答

you can use grep, then take lines in jumps: grep -A1 'blah' logfile | awk 'NR%3==2' you can also take n lines after match, for example: seq 100 | grep -A3 .2 | awk 'NR%5==4' 15 25 35 45 55 65 75 85 95 explanation - here we want to grep all lines that are *2 and take 3 lines after it, which is *5. seq 100 | grep -A3 .2 will give you: 12 13 14 15 -- 22 23 24 25 -- ... the number in the modulo (NR%5) is the added rows by grep (here it's 3 by the flag -A3), +2 extra lines because you have current matching line and also the -- line that the grep is adding.

如果下一行从来没有包含'blah',你可以过滤他们:

grep -A1 blah logfile | grep -v blah

使用cat logfile |…不需要。

grep /Pattern/ | tail -n 2 | head -n

尾先2个,头最后一个,比赛结束后正好排在第一行。

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

Perl一行程序警告

只是为了好玩……匹配后只打印一行

perl -lne '$. == $next && print; $next = ($.+1) if /match/' data.txt

更有趣的是……匹配后打印接下来的十行

perl -lne 'push @nexts, (($.+1)..($.+10)) if /match/; $. ~~ @nexts && print' data.txt

虽然有点作弊,因为实际上有两个命令