Awk
如果模式匹配,則列印上行和下四行
我有一個文本文件說 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/awk
(text/gawk
包),你可能也有/usr/gnu/bin/grep
(text/gnu-grep
包),然後可以使用它的-A
/-B
擴展:/usr/gnu/bin/grep -B1 -A4 error < your-file
(GNU用線條
grep
分隔不重疊的組)。--