Solaris 的 grep -A 备用命令是什么?

What is the alternate command of grep -A for Solaris?

我正在尝试从服务器日志文件中获取一些异常详细信息。 我试过这个:

cat server.log | grep -A10 exception

以便我可以获得异常详细信息。 但服务器响应是:

grep: illegal option -- A

Solaris 中是否有替代上述命令的方法?请帮忙

根据 man.

-A 上下文(和有用的)选项似乎不是 Solaris grep 的一部分

您可以尝试重新编译 grep source code

如果您对 Perl 或 python 有足够的了解,像 grep -A 10 exception files 这样的命令不会占用很多行。

这是一个 Perl 示例,其工作方式类似于 cat file | grepa.pl exception 在找到关键字后显示 10 行上下文(或在当前目录中显示 ./grepa.pl)。

grepa.pl

#!/usr/bin/perl

$CONTEXT = 10;

$search = $ARGV[0] or die "need search term!";
$n = 0;

while(<STDIN>) {
     $n = $CONTEXT+1 if (/$search/);
     if ($n) {
          print;
          $n--;
     }
}

可以改进该程序以将 $CONTEXT 作为参数给出,或搜索任何正则表达式。

使用 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?":":"-") [=15=];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

您也可以为此使用 sed:

打印接下来的 10 行,包括包含匹配模式的行。

sed -n '/pattern/{p;n;p;n;p;n;p;n;p;n;}/' file_name

打印下 10 行,不包括包含匹配模式的行。

sed -n '/pattern/{n;p;n;p;n;p;n;p;n;p;}/' file_name

您可以通过添加或删除 n 和 p 来调整要显示的行数。如果数字很大,awk 是更好的选择,但 sed 方法很简单。