我試圖生成一個臨時主機文件,該文件基於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中實現,那將是更可取的。先謝謝你!
非常感謝!我正在使用的設備沒有排序命令,但我使用「| awk'!x [$ 2] ++'」來修復它。這在效率等方面可以嗎?是否也可以合併大部分重複的行,例如示例中給出的維基百科示例?謝謝 – Matthew