Solaris 查找上一个日志行

Solaris 查找上一个日志行

我们在工作中运行Solaris 10。我想做的是找到另一行之前的行。

真实的例子。我可以通过以下查询发现我们的一些请求超时。

grep 超时日志.log。

这给了我类似的东西:

2010-11-30 20:59:57,495 ERROR [82.69.73.87 - 342E15CB9651927BE715780FC40DEC53 - 3675058] Send Call (AbstractEngineServlet.java:288) > - Merchant error HTTPS Comms found. Merchant Trans Id: 22283845800 The host did not accept the connection within timeout of 60000 ms

虽然在日志文件中,但它可能是我们记录要调用的几行之前的内容

2010-11-30 20:56:57,495 INFO [82.69.73.87 - 342E15CB9651927BE715780FC40DEC53 - 3675058] about to call http://www.example.com

所以我想做的是识别所有超时,然后识别所有直接位于前面且具有相同 IP 地址或会话的“即将呼叫”行。

在上面的例子中,它会找到包含“342E15CB9651927BE715780FC40DEC53”的前一行,使用标准 shell 工具可以做到这一点吗?

答案1

这看起来像是 awk 的工作。假设您的日志足够规律(特别是我将会话 cookie 提取为第六个字段):

<foo.log awk '
  /about to call/ {target[$6]=$0;}
  /AbstractEngineServlet.*timeout/ {print target[$6]; print;}
'

答案2

for i in `grep timeout log.txt|awk '{print $6}'`;
do
  grep $i log.txt;
  echo "-----------------";
done

答案3

未经测试,但类似

#!/usr/bin/env perl

my %lastline;

while (<>) {
    if (/\b([[:xdigit:]]{32})\b/) {
        if (/INFO/) {
            $lastline{$1} = $_;
        }
        elsif (/ERROR/) {
            print delete $lastline{$1} if exists $lastline{$1};
            print;
        }
    }
}

可能有效。

相关内容