2012-06-20 6 views
2

dnsmasq에서 제공하는 DNS 로그를 기반으로 임시 호스트 파일을 생성하려고합니다. 대부분 작동하지만 CNAME에 문제가 있습니다. 나는 지금까지 내가 성취 한 것을 보여줄 것이다.awk를 사용하여 줄 단위로 검색하고 그 결과를 다음 줄에 추가하십시오.

내가 얻을 필요가있는 로그에는 3 가지 유형의 응답이 있습니다. 간단한이 출력 될 수있다 "64.34.119.12 stackoverflow.com"

grep reply /tmp/dnslog | grep -v 'NXDOMAIN\|NODATA' | awk '{print $8 " " $6}' 

로그의 다른 종류의 CNAME이 우려를 사용하는 예를 들어

Jun 20 14:27:59 dnsmasq[2551]: reply stackoverflow.com is 64.34.119.12 

로그에서 추출하는 것은 매우 쉽습니다, 여기 하나의 예; 그러나이 방법은 거기에 로그 다음 유형에 대해 작동하지 않는다

grep reply /tmp/dnslog | grep -v 'NXDOMAIN\|NODATA' | awk '{print $8 "\t" $6}' | awk '/CNAME/ {name=$2; getline ; print $0 " " 'name'}' 

를 사용

Jun 20 14:42:11 dnsmasq[2551]: reply www.videolan.org is <CNAME> 
Jun 20 14:42:11 dnsmasq[2551]: reply ganesh.videolan.org is 88.191.250.2 

이 출력 될 수있는 "88.191.250.2 ganesh.videolan.org www.videolan.org" 다수의 CNAME이는

Jun 20 15:00:42 dnsmasq[2551]: reply en.wikipedia.org is <CNAME>       
Jun 20 15:00:42 dnsmasq[2551]: reply wikipedia-lb.wikimedia.org is <CNAME>    
Jun 20 15:00:42 dnsmasq[2551]: reply wikipedia-lb.esams.wikimedia.org is 91.198.174.225 

이전 명령은 다음과 같은 결과

,132에게 부여합니다 있습니다 10

두 번째와 함께 언급 된 첫 번째 명령을 사용하면 wikipedia-lb.esams.wikimedia.org는 91.198.174.225와 연결되지만 wikipedia-lb.wikimedia.org는 wikipedia-lb.esams.wikimedia와 연결되지 않습니다. .org. 이상적인 결과는이

91.198.174.225 wikipedia-lb.esams.wikimedia.org wikipedia-lb.wikimedia.org  en.wikipedia.org 

이 문제를 해결하려면 다음, 내가 파일 거꾸로 읽을 필요가 생각해야하지만 다음 라인에 추가 할, AWK의의 getline 부분이 엉망을하고있는 것인가?

이상적으로 두 스크립트를 따로 실행하지 않고 모든 결과를 출력하는 명령에 두 가지 유형의 로그를 결합하고 싶습니다. 누구든지 awk 명령을 수선하는데 도움을 줄 수 있습니까?

다음은 "grep reply/var/dnslog"샘플이며 원하는 호스트 파일이 출력됩니다. 현재 이차적 인 다른 문제가 있습니다. 이는 원하는 호스트 출력에서 ​​강조 표시됩니다.

Jun 20 15:28:21 dnsmasq[2551]: reply photos-a.ak.fbcdn.net is <CNAME> 
Jun 20 15:28:21 dnsmasq[2551]: reply photos-a.ak.facebook.com.edgesuite.net is <CNAME> 
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.25 
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.48 
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.64 
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.9 
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.26 
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.51 
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.8 
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.50 
Jun 20 15:28:21 dnsmasq[2551]: reply a995.dspmm1.akamai.net is 213.200.108.65 
Jun 20 15:28:22 dnsmasq[2551]: reply stackoverflow.com is 64.34.119.12 
Jun 20 15:29:41 dnsmasq[2551]: reply www.wikipedia.org is <CNAME> 
Jun 20 15:29:41 dnsmasq[2551]: reply wikipedia-lb.wikimedia.org is <CNAME> 
Jun 20 15:29:41 dnsmasq[2551]: reply wikipedia-lb.esams.wikimedia.org is 91.198.174.225 
Jun 20 15:29:42 dnsmasq[2551]: reply en.wikipedia.org is <CNAME> 
Jun 20 15:29:42 dnsmasq[2551]: reply wikipedia-lb.wikimedia.org is <CNAME> 
Jun 20 15:29:42 dnsmasq[2551]: reply wikipedia-lb.esams.wikimedia.org is 91.198.174.225 
Jun 20 15:29:42 dnsmasq[2551]: reply ja.wikipedia.org is <CNAME> 
Jun 20 15:29:42 dnsmasq[2551]: reply wikipedia-lb.wikimedia.org is <CNAME> 
Jun 20 15:29:42 dnsmasq[2551]: reply wikipedia-lb.esams.wikimedia.org is 91.198.174.225 

호스트는

213.200.108.26 a995.dspmm1.akamai.net photos-a.ak.facebook.com.edgesuite.net photos-a.ak.fbcdn.net 
##ideally select 1 host at random from multiple of a995.dspmm1.akamai.net, although list may be randomised already so 1st will suffice## 
64.34.119.12 stackoverflow.com 
91.198.174.225 wikipedia-lb.esams.wikimedia.org wikipedia-lb.wikimedia.org www.wikipedia.org 
91.198.174.225 wikipedia-lb.esams.wikimedia.org wikipedia-lb.wikimedia.org en.wikipedia.org 
91.198.174.225 wikipedia-lb.esams.wikimedia.org wikipedia-lb.wikimedia.org ja.wikipedia.org 
##Ideally, detect these similarities for wikipedia and convert the 3 lines into this;## 
91.198.174.225 wikipedia-lb.esams.wikimedia.org wikipedia-lb.wikimedia.org www.wikipedia.org en.wikipedia.org ja.wikipedia.org 

의도가 파일이 가능한 작게해야하므로 파일이, 낮은 대역폭, 높은 대기 시간 링크를 배포 할 것입니다 파일. 장기간에 걸쳐이 파일을 사용하면 많은 문제가 발생할 것이라는 점을 알고 있습니다. 단시간 동안 만 파일을 유효하게 구성했습니다. 지적 된 문제에 도움을 줄 수있는 사람이라면 크게 환영 할 것입니다. 또한 제한된 범위의 UNIX 응용 프로그램을 사용할 수 있습니다. awk에서 위와 같은 결과를 얻을 수 있다면 좋을 것입니다. 미리 감사드립니다.

답변

0

sortawk 사용 :

..|awk '{if($8 ~ /<CNAME>/){load=load" "$6}else{print $8" "load" "$6;load=""}}' 
    | sort -u -k2 
+0

대단히 감사합니다. 내가 사용하고있는 장치에는 sort 명령이 없지만이를 해결하기 위해 "| awk '! x [$ 2] ++'"를 사용했습니다. 효율면에서이게 괜찮습니까? 샘플에 제공된 위키피디아 예제와 같이 대부분 중복 된 행을 병합하는 것이 가능합니까? 감사 – Matthew

0

전화가 awk -f parse.awk dnsmasq.log를 사용하여.

/reply/ { 
    host = $6; 
    ip = $8; 

    names[length(names)+1] = host; 

    if (ip !~ /CNAME/) { 
    # assign all names up to now the same IP 
    # This will overwrite any previous IP assignment as well 
    for (i in names) IPs[names[i]] = ip; 
    delete names; 
    } 
} 

END { 
    # collate hostnames for a particular IP 
    for (host in IPs) hosts[IPs[host]] = hosts[IPs[host]]" "host; 
    for (IP in hosts) print IP hosts[IP]; 
}