我有一个类似这样的文件:
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}'
分隔的块是空白的,它工作得很好。