2013-07-18 6 views
3

본질적으로 압축 된 로그 파일 인 .gz 로그 파일에서 특정 값 (이 경우 userAgent)을 추출하려고합니다. 이러한 로그 파일에 각 로그 문장의 형식은 다음과 같습니다유닉스에서 .gz 로그 파일의 값을 추출하십시오.

userAgent=BundleDeviceFamily/iPhone,iPad (iPad; iPad2,5; iPad2,5; iPhone OS 6.1.3) 
userAgent=FNetwork/609.1.4 Darwin/13.0.0 

:

이 경우
2013-06-20;02:00:02.503 [[email protected]]-Activity [[email protected] appId=testApp userAgent=BundleDeviceFamily/iPhone,iPad (iPad; iPad2,5; iPad2,5; iPhone OS 6.1.3) EXEC_TM=123 FLOW=response TOKN_TM=0 GW_TM=2314.529 http.status=200 id=029dde45-802c-462a-902b-138bc5490fba offeringId=iPad httpUrl= test.com AUD_TM=0 ipAddress=10.10.10.10 ]\ 

2013-06-20;02:00:02.504 [[email protected]]-Activity [[email protected] appId=testApp userAgent=FNetwork/609.1.4 Darwin/13.0.0 id=029dde45-802c-462a-902b-138bc5490fba EXEC_TM=123 FLOW=response TOKN_TM=0 GW_TM=2314.529 http.status=200 offeringId=iPad httpUrl= test.com AUD_TM=0 ipAddress=10.10.10.10 ] 

이, 나도 아래 형식 중 하나로 결과의 userAgent 필드를 추출하여 표시 할 등등 ..

또는 인쇄 단지 값과 같은 :

BundleDeviceFamily/iPhone,iPad (iPad; iPad2,5; iPad2,5; iPhone OS 6.1.3) 
FNetwork/609.1.4 Darwin/13.0.0 

편집 : 그냥 자세한 정보를 추가하려면 key1 = value1 key2 = value2와 같이 공백으로 구분 된 필드는 임의의 순서로 표시 될 수 있습니다.

감사합니다. 감사! 사용

답변

3

당신이 key=value쌍 임의의 순서로 나타날 수 있음을 언급 한 이후, 여기 awk와 함께 일을 한 가지 방법입니다.

zcat input.gz | awk -F= ' 
{ 
    for(i=1;i<=NF;i++) { 
    if($i~/userAgent/) { 
     sub(/[^ ]+$/,"",$(i+1)) 
     print "userAgent="$(i+1) 
    } 
    } 
}' 
+0

+1. 이 작품! 빠른 답장을 보내 주셔서 감사합니다. – codehammer

4

+ :

zcat input.gz | sed -n 's/.*\(userAgent=[^=]*\) [^ =][^ =]*=.*/\1/p' 

또한 와 조금 짧아 질 수 있습니다 - :

zcat input.gz | sed -n 's/.*\(userAgent=[^=]*\) [^ =]\+=.*/\1/p' 

일부 , 콤보 :

zcat input.gz | grep -o 'userAgent=[^=]*' | sed 's/ [^ ]*$//' 

,498,및 (감사 lhf)에 결합 될 수있다 :

zgrep -o 'userAgent=[^=]*' input.gz | sed 's/ [^ ]*$//' 
+0

'EXEC_TM'이 로그에서 'userAgent'를 따르지 않으면 +1됩니다. OP의 샘플 데이터를 기반으로하는 것이 아닌 것처럼 보입니다. –

+0

빠른 답장을 보내 주셔서 감사합니다. 실제로 필드는 어떤 순서로든 나타날 수 있으므로 userAgent 필드 다음에 * EXEC 필드가 없으면이 필드는 중단됩니다. 나는이 예를 더 분명하게 편집했다. 어쨌든 입력 해 주셔서 감사합니다. JS 웃이 제안한 솔루션은 완벽하게 작동합니다. – codehammer

+1

@ hi10, 방금 대답을 업데이트했습니다 :) – perreal