grep -A1 'blah' logfile
多亏了这个命令,每一行都有'blah',我得到了包含'blah'的行输出和日志文件中的下一行。这可能是一个简单的,但我找不到一种方法来省略一行有'blah',只显示下一行在输出。
grep -A1 'blah' logfile
多亏了这个命令,每一行都有'blah',我得到了包含'blah'的行输出和日志文件中的下一行。这可能是一个简单的,但我找不到一种方法来省略一行有'blah',只显示下一行在输出。
当前回答
Perl一行程序警告
只是为了好玩……匹配后只打印一行
perl -lne '$. == $next && print; $next = ($.+1) if /match/' data.txt
更有趣的是……匹配后打印接下来的十行
perl -lne 'push @nexts, (($.+1)..($.+10)) if /match/; $. ~~ @nexts && print' data.txt
虽然有点作弊,因为实际上有两个命令
其他回答
Perl一行程序警告
只是为了好玩……匹配后只打印一行
perl -lne '$. == $next && print; $next = ($.+1) if /match/' data.txt
更有趣的是……匹配后打印接下来的十行
perl -lne 'push @nexts, (($.+1)..($.+10)) if /match/; $. ~~ @nexts && print' data.txt
虽然有点作弊,因为实际上有两个命令
使用grep可以输出行号(-n)。通过<num>:和<num>-,匹配和下一行之间的输出是不同的:
# grep -A1 -n '230 Login successful."$' /var/log/vsftpd.log
1:Sat Nov 5 03:29:43 2022 [pid 10] [foo] FTP response: Client "10.1.1.1", "230 Login successful."
2-Sat Nov 5 03:29:43 2022 [pid 10] [foo] FTP response: Client "10.1.1.1", "221 Goodbye."
3:Sat Nov 5 04:44:41 2022 [pid 10] [foo] FTP response: Client "10.1.1.1", "230 Login successful."
4-Sat Nov 5 04:44:42 2022 [pid 10] [foo] FTP response: Client "10.1.1.1", "221 Goodbye."
这样我们就可以过滤输出,只得到每个匹配的下一行:
# grep -A1 -n '230 Login successful."$' /var/log/vsftpd.log | grep -E "^[0-9]+-" | cut -d"-" -f2-
Sat Nov 5 03:29:43 2022 [pid 10] [foo] FTP response: Client "10.1.1.1", "221 Goodbye."
Sat Nov 5 04:44:42 2022 [pid 10] [foo] FTP response: Client "10.1.1.1", "221 Goodbye."
总的来说,我同意您在这里要求使用大量grep,而另一种工具可能是更好的解决方案。但是在嵌入式环境中,我可能不希望使用sed或awk来完成此操作。我发现以下解决方案是有效的(只要它们不是连续的匹配):
grep -A1 AT\+CSQ wvdial.out | grep -v AT\+CSQ
基本上,匹配它们,为每个匹配附加一行上下文,然后通过原始模式的反向匹配来将它们剥离出来。当然,这意味着您可以假设您的模式不会出现在“下一行”中。
我不知道有什么方法可以用grep来做到这一点,但是使用awk可以达到相同的结果:
awk '/blah/ {getline;print}' < logfile
reaim的回答很好,对我很有用。将其扩展到打印模式之后的第7行是很简单的
awk -v lines=7 '/blah/ {for(i=lines;i;--i)getline; print $0 }' logfile