使用 awk 可以实现与 grep -A 相同的行为:
awk -v A=10 '/exception/{f=A+1} f{print;f--}' server.log
上面打印了匹配项及其后面的十行,就像grep -A10 exception server.log。 A 的值可以随意更改。
示例
考虑这个示例文件:
$ cat server.log
a
b
c
exception
1
2
3
4
5
将 A 设置为 3,输出如下:
$ awk -v A=3 '/exception/{f=A+1} f{print;f--}' server.log
exception
1
2
3
SunOS/Solaris 的特别说明
众所周知,Sun/Solaris 上的本机 awk 充满了错误。取而代之的是 nawk 或
更好的是/usr/xpg4/bin/awk 或/usr/xpg6/bin/awk。例如:
/usr/xpg4/bin/awk -v A=10 '/exception/{f=A+1} f{print;f--}' server.log
用多个文件模拟 grep 的行为
当给定多个文件名时,grep 的输出变为:
$ grep -A3 exception server.log server.log
server.log:exception
server.log-1
server.log-2
server.log-3
--
server.log:exception
server.log-1
server.log-2
server.log-3
我们也可以用 awk 来模拟(这可能需要 GNU awk):
$ awk -v A=3 '/exception/{f=A+1;if(x)print"---";x=1} f{print FILENAME (f==A+1?":":"-") $0;f--}' server.log server.log
server.log:exception
server.log-1
server.log-2
server.log-3
---
server.log:exception
server.log-1
server.log-2
server.log-3