Awk

如果模式匹配,則列印上行和下四行

  • February 11, 2020

我有一個文本文件說 input.txt 包含以下數據

$ cat input.txt

text1
error
text2
text3
text4
xyz
asd
asdf
text10
error
text11
text12
text13
text14
def
ghi
jkl
text16
error
text17
text18
text19
text20

我正在輸入文件中搜尋“錯誤”。所以我需要在模式匹配時列印前一行和後 4 行。此外,該模式可以多次出現。

我需要如下輸出

text1
error
text2
text3
text4
text10
error
text11
text12
text13
text14
text16
error
text17
text18
text19
text20

作業系統是 Solaris,所以grep -A在這裡不起作用

awk

awk '/error/ {n = 6}
          n {print prev; n--}
            {prev = $0}
        END {if (n) print}
   ' < your-file

或者在這些 6 行(假設沒有重疊)行之間添加一個空行:

awk '/error/ {n = 6; if (x++) print ""}
          n {print prev; n--}
            {prev = $0}
        END {if (n) print}
   ' < your-file

確保在 Solaris 上使用/usr/xpg4/bin/awk,nawk或。/usr/gnu/bin/awk其中一個/bin是 70 年代的古老版本,不支持現代標準語法。

如果你有/usr/gnu/bin/awktext/gawk包),你可能也有/usr/gnu/bin/greptext/gnu-grep包),然後可以使用它的-A/-B擴展:

/usr/gnu/bin/grep -B1 -A4 error < your-file

(GNU用線條grep分隔不重疊的組)。--

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