【问题标题】:What is the alternate command of grep -A for Solaris?用于 Solaris 的 grep -A 的替代命令是什么?
【发布时间】:2016-05-30 05:06:02
【问题描述】:

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

cat server.log | grep -A10 exception

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

grep: illegal option -- A

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

【问题讨论】:

  • Solaris 的哪个版本?你可能有 /usr/gnu/bin/grep/usr/sfw/bin/grep 可用于具有 -A 选项的 GNU grep。

标签: linux shell solaris glassfish-3


【解决方案1】:

使用 awk 可以实现与 grep -A 相同的行为:

awk -v A=10 '/exception/{f=A+1} f{print;f--}' server.log

上面打印了匹配项及其后面的十行,就像grep -A10 exception server.logA 的值可以随意更改。

示例

考虑这个示例文件:

$ 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

【讨论】:

  • grep -A 在 grepping 多个文件和/或打印行号时添加了一些格式;为了从上下文中区分匹配,在匹配行的文件名或行号之后打印一个冒号,而上下文行则使用破折号。
【解决方案2】:

根据man-A 上下文(并且有用)选项似乎不是 Solaris grep 的一部分。

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

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

这是一个类似于 cat file | grepa.pl exception 的 Perl 示例,在找到关键字后显示 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 作为参数给出,或搜索任何正则表达式。

【讨论】:

  • 这里并不重要,但是如果你有多个模式,例如,在循环之前编译正则表达式会是一个好主意。
【解决方案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 方法很简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 2022-07-17
    • 2022-08-02
    • 2015-08-11
    相关资源
    最近更新 更多