2017-02-28 1 views
0

AWK 출력에 다른 열 추가 :나는 이와 유사한 내용으로 HAProxy 로그 파일이

Field 1    Field 2   Field 3   Field 4   Field 5   Field 6 
Date/time  HTTP status code  HTTP Method  Request  HTTP version Referer URL 
:

Feb 28 11:16:10 localhost haproxy[20072]: 88.88.88.88:6152 [28/Feb/2017:11:16:01.220] frontend backend_srvs/srv1 9063/0/0/39/9102 200 694 - - --VN 9984/5492/191/44/0 0/0 {Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36|http://subdomain.domain.com/location1} "GET /location1 HTTP/1.1" 
Feb 28 11:16:10 localhost haproxy[20072]: 88.88.88.88:6152 [28/Feb/2017:11:16:10.322] frontend backend_srvs/srv1 513/0/0/124/637 200 14381 - - --VN 9970/5491/223/55/0 0/0 {Mozilla/5.0 AppleWebKit/537.36 Chrome/56.0.2924.87 Safari/537.36|http://subdomain.domain.com/location2} "GET /location2 HTTP/1.1" 
Feb 28 11:16:13 localhost haproxy[20072]: 88.88.88.88:6152 [28/Feb/2017:11:16:10.960] frontend backend_srvs/srv1 2245/0/0/3/2248 200 7448 - - --VN 9998/5522/263/54/0 0/0 {another user agent with fewer columns|http://subdomain.domain.com/location3} "GET /location3 HTTP/1.1" 
Feb 28 11:16:13 localhost haproxy[20072]: 88.88.88.88:6152 [28/Feb/2017:11:16:10.960] frontend backend_srvs/srv1 2245/0/0/3/2248 200 7448 - - --VN 9998/5522/263/54/0 0/0 {Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36|} "GET /another_location HTTP/1.1" 

나는 다음과 같은 출력을 위해 일부 필드를 추출 할을

기본적으로, 특히이 경우, 출력은 다음과 같아야

Feb 28 11:16:10 200 GET /location1 HTTP/1.1 http://subdomain.domain.com/location1 
Feb 28 11:16:10 200 GET /location2 HTTP/1.1 http://subdomain.domain.com/location2 
Feb 28 11:16:13 200 GET /location3 HTTP/1.1 http://subdomain.domain.com/location3 
Feb 28 11:16:13 200 GET /another_location HTTP/1.1 
여기

유일한 문제 리퍼러 URL을 추출한다 사용자 에이전트와 함께 중괄호 사이에 있으며 파이프로 구분됩니다. 또한 사용자 에이전트는 가변 개수의 필드를 가지고있다. 내가 생각할 수

유일한 해결책은 별도로 리퍼러 URL을 추출하고 함께 열을 붙여되었다

requests_temp=`grep -F " 88.88.88.88:" /root/file.log | tr -d '"'` 
requests=`echo "${requests_temp}" | awk '{print $1" "$2" "$3" "$11, $(NF-2), $(NF-1), $NF}' > /tmp/requests_tmp` 
referer_url=`echo "${requests_temp}" | awk 'NR > 1 {print $1}' RS='{' FS='}' | awk -F'|' '{ print $2 }' > /tmp/referer_url_tmp` 

paste /tmp/abuse_requests_tmp /tmp/referer_url_tmp 

그러나 나는이 방법처럼 정말하지 않습니다. 하나의 awk 라인 만 사용하여 다른 방법을 사용할 수 있습니까? 어쩌면 referer url 열을 awk 내부의 변수에 할당 한 다음 동일한 출력을 생성하는 데 사용할 수 있습니까?

답변

1

는 솔루션 아래에 시도 -

awk '/88.88.88.88/ {gsub(/"/,"",$0);split($(NF-3),a,"|"); {print $1,$2,$3,$11, $(NF-2), $(NF-1), $NF, substr(a[2],1,(length(a[2])-1))}}' a 
Feb 28 11:16:10 200 GET /location1 HTTP/1.1 http://subdomain.domain.com/location1 
Feb 28 11:16:10 200 GET /location2 HTTP/1.1 http://subdomain.domain.com/location2 
Feb 28 11:16:13 200 GET /location3 HTTP/1.1 http://subdomain.domain.com/location3 
Feb 28 11:16:13 200 GET /another_location HTTP/1.1 
1

는 한 번 awk를 사용하여 모든 작업을 수행 할 수

awk '$6 ~ /88\.88\.88\.88:[0-9]+/{ 
    split($0,a,/[{}]/) 
    $0=a[1] OFS a[3] 
    split(a[2],b,"|") 
    print $1,$2,$3,$11,substr($18,2),$19,substr($20,1,length($20)-1),b[2] 
}' file.log 

split 배열 a으로합니다 ({...} 사이에 포함됨) 라인의 가변 부분을 분할한다.

라인은 | 자에 기초하여 변수에서 URL을 추출 허용 필드

split$0=a[1] OFS a[3]의 수정 횟수를 위해 재구성된다.

마침내 print은 필요한 모든 요소를 ​​보여줍니다. 여기 substr"을 (를) 제거하는 데 사용됩니다.

+0

당신은 내 파일은 또한 당신의 솔루션을 인쇄 얻을 것이다 다른 IP, 하나 개 더 많은 가치를 가지고있는 경우, IP 주소 (88.88.88.88)에 대한 필터를 추가하는 것을 잊었다. –

+0

@VIPINKUMAR 방금이 조건을 추가했습니다 ... 감사합니다 ... – oliv

관련 문제