grep 模式下两行并丢弃其中一行的模式

grep 模式下两行并丢弃其中一行的模式

我有一个类似这样的文件:

DN: 达南

cn: 大年

cn: 大年1


域名:danian2

cn: 大年2


域名:danian3

cn: 大年3

cn: 大年4

我想做的就是 grep 模式“dn:”并仅打印接下来的两行,但是当我运行 grep -A 2“dn:”时,结果是文件中的所有内容,我只想打印接下来的两行不是下 1 行

答案1

这可能有效:

$ awk -v RS="dn: " -v FS="\n" -v ORS="" 'NF>3 {print "dn:",$0}' input.txt

我们定义dn:为记录分隔符。一条记录中的字段由换行符分隔\n

如果在以 开头的行后面有两行dn:,在新记录以 开头之前dn:,您将有 3 个“\n”,导致记录中的 4 个字段。这就是为什么我们检查记录中是否有超过 3 个字段 ( NF>3)。如果是这种情况,我们会打印出整个记录,但需要在前面添加dn:.

请注意,这NF>3将查找一条记录中包含多于两行以下行的所有记录。如果您只想要那些恰好有两个的,请将其更改为NF==3.

如果块由空行分隔(正如您后来的评论之一所示),请改用:

$ awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}' input.txt

答案2

我运行上面的命令并且运行良好,

awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}' 

分隔的块是空白的,它工作得很好。

相关内容