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 方法很简单。
我正在尝试从服务器日志文件中获取一些异常详细信息。 我试过这个:
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 方法很简单。