我们在工作中运行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;
}
}
}
可能有效。