如何在模式匹配后仅针对多个模式中的一个模式进行 grep 行
How to grep line after pattern match only for one pattern out of many
我有一个类似下面的数据文件。我想 grep“PANIC:”、“Node 0/1/2/3:”和空行,但只想将下一行(“-A1”选项)包含到一个模式 - “PANIC:”,而不是其他模式。怎么做。
请帮忙寻找解决方案
# cat data.txt
Node 0:
DATE: 2020-12-19 04:06:44
DATE: 2020-12-19 07:02:54
PANIC: ABC
DATE: 2020-12-19 20:02:54
DATE: 2020-12-18 21:25:39
Node 1:
DATE: 2020-12-20 09:35:43
DATE: 2020-12-20 12:12:29
Node 2:
Node 3:
DATE: 2020-12-19 20:03:00
DATE: 2020-12-19 15:35:09
PANIC: XYZ
DATE: 2020-12-19 06:44:27
#
# cat data.txt | grep -A1 --no-group-separator -e PANIC: -e 'Node [0-7]:' -e ^$
Node 0:
DATE: 2020-12-19 04:06:44
PANIC: ABC
DATE: 2020-12-19 20:02:54
Node 1:
DATE: 2020-12-20 09:35:43
Node 2:
DATE: 2020-12-20 03:00:15
Node 3:
DATE: 2020-12-19 20:03:00
PANIC: XYZ
DATE: 2020-12-19 06:44:27
#
预期过滤后的数据是这样的
Node 0:
PANIC: ABC
DATE: 2020-12-19 20:02:54
Node 1:
Node 2:
Node 3:
PANIC: XYZ
DATE: 2020-12-19 06:44:27
使用 awk
awk -F: ' /Node|PANIC/ { print; if(~/PANIC/) { getline; print} } ' data.txt
结果:
$ awk -F: ' /Node|PANIC/ { print; if(~/PANIC/) { getline; print} } ' susanta.txt
Node 0:
PANIC: ABC
DATE: 2020-12-19 20:02:54
Node 1:
Node 2:
Node 3:
PANIC: XYZ
DATE: 2020-12-19 06:44:27
$
你可以按照你的要求做:
awk '/PANIC:/{print; getline; print} /Node [0-7]/ || /^ *$/' input
虽然您没有在问题中提及它,但您的示例输出表明您还想将多个空行组合成一个空行。这可以通过以下方式完成:
awk '/./{a=0} /PANIC:/{print; getline; print} /^ *$/ && !a++{print} /Node [0-7]/' input
要打印 PANIC 匹配之前的行,最简单的方法可能是简单地记录上一行。类似于:
awk '/PANIC:/{print prev; print; getline; print} { prev = [=12=] } /Node [0-7]/ || /^ *$/' input | perl -00pe1
我有一个类似下面的数据文件。我想 grep“PANIC:”、“Node 0/1/2/3:”和空行,但只想将下一行(“-A1”选项)包含到一个模式 - “PANIC:”,而不是其他模式。怎么做。
请帮忙寻找解决方案
# cat data.txt
Node 0:
DATE: 2020-12-19 04:06:44
DATE: 2020-12-19 07:02:54
PANIC: ABC
DATE: 2020-12-19 20:02:54
DATE: 2020-12-18 21:25:39
Node 1:
DATE: 2020-12-20 09:35:43
DATE: 2020-12-20 12:12:29
Node 2:
Node 3:
DATE: 2020-12-19 20:03:00
DATE: 2020-12-19 15:35:09
PANIC: XYZ
DATE: 2020-12-19 06:44:27
#
# cat data.txt | grep -A1 --no-group-separator -e PANIC: -e 'Node [0-7]:' -e ^$
Node 0:
DATE: 2020-12-19 04:06:44
PANIC: ABC
DATE: 2020-12-19 20:02:54
Node 1:
DATE: 2020-12-20 09:35:43
Node 2:
DATE: 2020-12-20 03:00:15
Node 3:
DATE: 2020-12-19 20:03:00
PANIC: XYZ
DATE: 2020-12-19 06:44:27
#
预期过滤后的数据是这样的
Node 0:
PANIC: ABC
DATE: 2020-12-19 20:02:54
Node 1:
Node 2:
Node 3:
PANIC: XYZ
DATE: 2020-12-19 06:44:27
使用 awk
awk -F: ' /Node|PANIC/ { print; if(~/PANIC/) { getline; print} } ' data.txt
结果:
$ awk -F: ' /Node|PANIC/ { print; if(~/PANIC/) { getline; print} } ' susanta.txt
Node 0:
PANIC: ABC
DATE: 2020-12-19 20:02:54
Node 1:
Node 2:
Node 3:
PANIC: XYZ
DATE: 2020-12-19 06:44:27
$
你可以按照你的要求做:
awk '/PANIC:/{print; getline; print} /Node [0-7]/ || /^ *$/' input
虽然您没有在问题中提及它,但您的示例输出表明您还想将多个空行组合成一个空行。这可以通过以下方式完成:
awk '/./{a=0} /PANIC:/{print; getline; print} /^ *$/ && !a++{print} /Node [0-7]/' input
要打印 PANIC 匹配之前的行,最简单的方法可能是简单地记录上一行。类似于:
awk '/PANIC:/{print prev; print; getline; print} { prev = [=12=] } /Node [0-7]/ || /^ *$/' input | perl -00pe1