여러 줄의 로그 항목의 서로 다른 줄에서 awk의 두 필드를 얻는 방법은 무엇입니까?

여러 줄의 로그 항목의 서로 다른 줄에서 awk의 두 필드를 얻는 방법은 무엇입니까?

웹 서버에서 로그 파일을 구문 분석하고 있으며, 로그 항목의 한 줄에 있는 IP 주소와 동일한 로그 항목의 다른 줄에 나타나는 사용자 이름을 연관시키려고 합니다.

아래와 같은 로그 항목이 있으므로 JSON의 양이 많습니다. 첫 번째 부분은 첫 번째 줄의 사용자 ID이고, 그 뒤에는 항상 동일한 형식의 추가 로그 정보가 오고, 마지막 줄은 IP 주소, 그 다음에는 추가 정보(포함되지 않음)가 옵니다.

awk는 여러 줄을 처리할 수 있습니까? 아니면 첫 번째 항목을 메모리 변수에 넣고 두 번째 필드가 통과할 때 출력하는 것을 고려해야 합니까?

2017-08-11 17:12:53.763 TRACE 25528 --- [http-nio-10040-exec-16] c.b.g.s.SpnegoAuthenticationFilter       : Principal [[email protected]] user ID =='pqr-xyz-coredev'
2017-08-11 17:12:53.764 TRACE 25528 --- [http-nio-10040-exec-16] c.b.g.s.SpnegoAuthenticationFilter       : No GoP header [Gop-User] for [email protected]
2017-08-11 17:12:53.764 TRACE 25528 --- [http-nio-10040-exec-16] c.b.g.s.SpnegoAuthenticationFilter       : User [pqr-xyz-coredev] details obtained.
 {
    "username": "pqr-xyz-coredev",
    "password": "[PROTECTED]",
    "country": null,
    "department": null,
    "title": null,
    "email": null,
    "enabled": true,
    "accountNonExpired": true,
    "credentialsNonExpired": true,
    "accountNonLocked": true,
    "grantedAuthorities": [
        "GBSUD101 SUPPORT",
        "RG OAG WE1-T1-01234 ADM"
    ]
}
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 URI: /data/load/REF.SWE.RUN.ALL.M.KBD/2017-08-11 GET
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 HEADER 'host': rsadffs199.abc1.com:10040
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 HEADER 'user-agent': PycURL/7.43.0 libcurl/7.52.1 WinSSL zlib/1.2.8
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 HEADER 'accept': */*
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 AUTHORIZATION: hash not displayed
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 PARAM 'endDate': 2099-12-31
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 PARAM 'startDate': 1900-01-01
2017-08-11 17:12:53.764 DEBUG 25528 --- [http-nio-10040-exec-16] c.b.g.u.s.RequestResponseLoggingFilter   : 936 REMOTE ADDRESS: 101.16.75.75

답변1

다음을 시도해 보세요 awk.

awk -F"[=':]" '/user ID/{userID=$(NF-1)} /REMOTE ADDRESS/{print userID"," $NF}' `infile.txt

산출:

pqr-xyz-coredev, 101.16.75.75

답변2

perl -F"\h+|'" -lane '
   /\huser\h+ID\h/ and $a = $F[-1];
   /\hREMOTE\h+ADDRESS:\h/ and print "$a $F[-1]";
' log.file
  • Perl옵션:
    • -F"\h+|'"이는 일련의 가로 공백이나 작은따옴표 문자로 현재 줄을 분할합니다. 이렇게 하면 우리가 찾고 있는 정보를 항상 마지막 필드에서 찾을 수 있습니다.
    • -l이것은 개행으로 설정 ORS되고 또한 IRS개행으로 설정됩니다.
    • -a옵션에서 제공하는 필드 구분 기호 -F또는 기본적으로 공백을 기준으로 입력 레코드를 분할합니다. 현재 레코드에서 구분된 필드는 배열에 저장됩니다 @F.
    • -n이는 암시적 입력 파일 읽기 루프를 설정하고 레코드를 stdout으로 자동 인쇄하는 것을 비활성화합니다.
  • user ID양쪽에 가로 공백이 있는 줄을 만나면 마지막 필드에 저장된 사용자 ID(예: )를 계속 기억합니다 $F[-1].
  • 수평선을 만났을 때 REMOTE ADDRESS:양쪽은 수평선으로 둘러싸여 있습니다. 공백이 있으면 이전에 저장된 사용자 ID와 IP 주소가 포함될 줄의 마지막 필드를 계속해서 인쇄합니다.

결과:

pqr-xyz-coredev 101.16.75.75

관련 정보