2012-06-20 20 views
2

我試圖生成一個臨時主機文件,該文件基於dnsmasq提供的DNS日誌。我主要工作,但是我有一個與CNAMEs的問題。我將展示我迄今取得的成就。使用awk按行向後搜索,並將結果附加到下一行

日誌中有3種類型的響應,我需要獲取。最簡單的是很容易從日誌中提取,如

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

這可輸出爲「64.34.119.12 stackoverflow.com」使用

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

其他類型的日誌涉及的CNAME記錄,這裏是一個例子;

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」使用

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

然而,該方法不適用於下述類型的日誌,那裏的工作多個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 

前面的命令給出以下結果

<CNAME> wikipedia-lb.wikimedia.org  en.wikipedia.org 

通過使用第一條命令和第二條命令,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

使用awksort:使用awk -f parse.awk dnsmasq.log

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

非常感謝!我正在使用的設備沒有排序命令,但我使用「| awk'!x [$ 2] ++'」來修復它。這在效率等方面可以嗎?是否也可以合併大部分重複的行,例如示例中給出的維基百科示例?謝謝 – Matthew

0

呼叫。

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