grep -A1 'blah' logfile
多亏了这个命令,每一行都有'blah',我得到了包含'blah'的行输出和日志文件中的下一行。这可能是一个简单的,但我找不到一种方法来省略一行有'blah',只显示下一行在输出。
grep -A1 'blah' logfile
多亏了这个命令,每一行都有'blah',我得到了包含'blah'的行输出和日志文件中的下一行。这可能是一个简单的,但我找不到一种方法来省略一行有'blah',只显示下一行在输出。
当前回答
滚边是你的朋友……
使用grep -A1显示匹配后的下一行,然后将结果管道到tail,只抓取一行,
cat logs/info.log | grep "term" -A1 | tail -n 1
其他回答
您可以尝试使用awk:
awk '/blah/{getline; print}' logfile
我不知道有什么方法可以用grep来做到这一点,但是使用awk可以达到相同的结果:
awk '/blah/ {getline;print}' < logfile
到目前为止,对于这个问题已经给出了许多很好的答案,但我仍然错过了一个awk没有使用getline的答案。因为,在一般情况下,没有必要使用getline,我将使用:
awk ' f && NR==f+1; /blah/ {f=NR}' file #all matches after "blah"
or
awk '/blah/ {f=NR} f && NR==f+1' file #matches after "blah" not being also "blah"
逻辑始终包括存储找到“blah”的行,然后打印后面一行的行。
Test
示例文件:
$ cat a
0
blah1
1
2
3
blah2
4
5
6
blah3
blah4
7
取“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
使用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:
grep -A1 'blah' logfile | grep -v "blah"
或者使用sed:
sed -n '/blah/{n;p;}' logfile