Solaris 이전 로그 줄 찾기

Solaris 이전 로그 줄 찾기

우리는 직장에서 Solaris 10을 실행합니다. 내가하고 싶은 것은 다른 행 앞에 있는 행을 찾는 것입니다.

실제 사례. 다음 쿼리를 통해 일부 요청이 시간 초과되었음을 알 수 있습니다.

grep 시간 초과 log.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"이 포함된 이전 줄을 찾습니다. 표준 셸 도구를 사용하여 이것이 가능합니까?

답변1

이것은 awk의 직업처럼 보입니다. 로그가 충분히 규칙적이라고 가정합니다(특히 세션 쿠키를 여섯 번째 필드로 추출했기 때문에).

<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;
        }
    }
}

작동할 수도 있습니다.

관련 정보