2013-09-30 37 views
1

我一直在慢慢穩定地開發bash腳本,可以快速獲取有關域的一些基本DNS信息。 (可以像LeafDNS或IntoDNS一樣思考,但我可以從CLI快速運行。)今天,一位同事給了我完成腳本所需的最後一部分,即如何獲取指向域的名稱服務器(及其IP)據域名註冊商vís-a-vísdig +trace +additional報告。需要提取兩個空行之間的文本塊

然而,問題是dig +trace +additional返回了大量額外的信息,我既不想也不需要。在返回的四個文本塊(用空行分隔)中,我只需要第三個(前兩個是根域名服務器,TLD的父域名服務器,第四個塊是DNS域中報告的域名服務器)。理想的情況下,我也想省略挖掘到第三塊文本末尾的評論,只有名稱服務器和它們的IP。

我確實發現this作爲一種解決方案,通過管道挖sed的輸出,但我只是模糊地熟悉sed。當我直接拷貝sed命令時,我得到第一個和第三個塊。下面是輸出的一個例子:

[email protected]:~ $ dig +trace +additional dragon-architect.com | sed '/^$/,/^$/!d' 

; <<>> DiG 9.7.3-P3 <<>> +trace +additional dragon-architect.com 
;; global options: +cmd 
.   214851 IN NS m.root-servers.net. 
.   214851 IN NS a.root-servers.net. 
.   214851 IN NS b.root-servers.net. 
.   214851 IN NS g.root-servers.net. 
.   214851 IN NS j.root-servers.net. 
.   214851 IN NS d.root-servers.net. 
.   214851 IN NS e.root-servers.net. 
.   214851 IN NS f.root-servers.net. 
.   214851 IN NS l.root-servers.net. 
.   214851 IN NS c.root-servers.net. 
.   214851 IN NS k.root-servers.net. 
.   214851 IN NS h.root-servers.net. 
.   214851 IN NS i.root-servers.net. 
;; Received 228 bytes from 192.168.16.1#53(192.168.16.1) in 18 ms 


dragon-architect.com. 172800 IN NS ns1.dragon-architect.com. 
dragon-architect.com. 172800 IN NS ns2.dragon-architect.com. 
ns1.dragon-architect.com. 172800 IN A 70.84.243.130 
ns2.dragon-architect.com. 172800 IN A 70.84.243.131 
;; Received 106 bytes from 192.33.14.30#53(b.gtld-servers.net) in 165 ms 


[email protected]:~ $ 

我幾乎失去了這一點,將非常感謝幫助。如果它簡單,優雅,高度便攜,易於閱讀,並附有關於sed命令如何工作的解釋,那麼免費獎勵點可以從中學到。我也願意使用grep或awk;以取得最便攜和可維護的結果爲準。

編輯: 我知道幾個挖掘參數(特別是+ nocomments和+ nostats)。不幸的是,它們不適用於+跟蹤。所以我必須用sed或awk手動刪除統計信息/評論。

編輯2: 此外,它沒有發生,直到我今天所需要的解決方案,以考慮像.co.uk或.com.au頂級域名。我在bbc.co.uk和melbourneit.com.au等幾個域名上運行了dig +trace +additional,看看這是否改變了輸出,但沒有。四塊輸出仍然返回,這意味着提供的解決方案仍然完全按照預期工作。

回答

0

您可以試用。將RS設置爲空字符串以將空白行中的寄存器拆分,並將FS設置爲換行符,以便使用該字符拆分每個寄存器的字段。這樣,我有選擇的第三個(FNR == 3),刪除最後一個字段($NF)和尾部的空格,並打印:

dig +trace +additional dragon-architect.com | awk ' 
    BEGIN { RS = ""; FS = OFS = "\n" } 
    FNR == 3 { $NF = ""; sub(/[[:space:]]+$/, ""); print } 
' 

它產生:

dragon-architect.com. 172800 IN NS ns1.dragon-architect.com. 
dragon-architect.com. 172800 IN NS ns2.dragon-architect.com. 
ns1.dragon-architect.com. 172800 IN A 70.84.243.130 
ns2.dragon-architect.com. 172800 IN A 70.84.243.131 
+0

這肯定會返回我需要的信息。 :) 謝謝! –

1

通過記錄選擇設置爲\n\n它將其劃分爲4區塊,然後打印區塊3。 PS這可能只適用於支持RS中多個字符的gawk和其他awk。

dig +trace +additional dragon-architect.com | awk 'NR==3' RS="\n\n" 
dragon-architect.com. 172800 IN  NS  ns1.dragon-architect.com. 
dragon-architect.com. 172800 IN  NS  ns2.dragon-architect.com. 
ns1.dragon-architect.com. 172800 IN  A  70.84.243.130 
ns2.dragon-architect.com. 172800 IN  A  70.84.243.131 
;; Received 106 bytes from 192.12.94.30#53(192.12.94.30) in 60 ms 

你甚至可以刪除單引號。但最好把它留在那裏。

awk NR==3 RS="\n\n" 
+0

作爲一個非常簡單和優雅的解決方案的額外榮譽。底部的額外評論行是不可取的,但我可以很容易地找出一種方法來過濾它。我希望自己有足夠的聲望可以對這個答案和我收到的另一個答覆。 –