如何在模式匹配后仅对许多模式中的一种进行 grep 行

问题描述

我有一个类似于以下内容的数据文件。我想 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($1~/PANIC/) { getline; print}  } ' data.txt

结果:

$ awk  -F: ' /Node|PANIC/ { print; if($1~/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 = $0 } /Node [0-7]/ || /^ *$/' input | perl -00pe1