如果模式匹配,则打印上方行和下方四行

如果模式匹配,则打印上方行和下方四行

我有一个文本文件 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在这里不起作用

答案1

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/grep也有(text/gnu-grep包)并且可以使用它的-A/-B扩展:

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

(GNUgrep用线分隔不重叠的组--)。

相关内容