Shell-Script

grep 模式下兩行並用一行丟棄模式

  • January 23, 2019

我有一個像這樣的文件:

dn: 大南

cn: danian

cn: 大年1


dn: 大年2

cn: 大年2


dn: danian3

cn: 大年3

cn: 大年4

我要做的就是 grep 模式“dn:”並只列印接下來的 2 行,但是當我執行 grep -A 2 “dn:”時,結果就是文件中的所有內容,我只想列印接下來的 2 行不是下 1 行

我執行上面的命令並且執行良好,

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

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

這可能有效:

$ 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

引用自:https://unix.stackexchange.com/questions/496057