我有一个文本文件 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/awk
(text/gawk
包),那么你很可能/usr/gnu/bin/grep
也有(text/gnu-grep
包)并且可以使用它的-A
/-B
扩展:
/usr/gnu/bin/grep -B1 -A4 error < your-file
(GNUgrep
用线分隔不重叠的组--
)。