我正在嘗試撰寫一個 bash 腳本,從串列中挖掘某些站點上的 MX。
除了域具有的 MX 之外,我不需要所有冗余資訊。
到目前為止,這是我的腳本的樣子:
#! /bin/bash
{ while IFS=';' read un fake
do
dig mx $un >> tmp.txt
awk -F ';' ' {print $1}' tmp.txt >> mxinfo.txt
done
} <mxlist.txt
mxlist.txt:
vg.no;
godaddy.com;
finn.no;
我從中得到的輸出是一整行的空白空間。
我希望它像這樣列印:
vg.no = ASPMX.L.GOOGLE.COM
vg.no = ALT1.ASPMX.L.GOOGLE.COM
vg.no = ALT2.ASPMX.L.GOOGLE.COM
vg.no = ALT3.ASPMX.L.GOOGLE.COM
godaddy.com = godaddy-com.mail.protection.outlook.com
finn.no = alt2.aspmx.l.google.com
finn.no = aspmx.l.google.com
finn.no = alt1.aspmx.l.google.com
finn.no = alt4.aspmx.l.google.com
finn.no = alt3.aspmx.l.google.com
您還會看到某些查詢出現兩次或更多次。
如果沒有額外的間距、冗余資訊和每個域只有一個輸出,我該如何寫得更好?
uj5u.com熱心網友回復:
只是使用怎么樣host,像這樣:
$ host -t mx vg.no
vg.no mail is handled by 5 ALT1.ASPMX.L.GOOGLE.COM.
vg.no mail is handled by 10 ALT4.ASPMX.L.GOOGLE.COM.
vg.no mail is handled by 1 ASPMX.L.GOOGLE.COM.
vg.no mail is handled by 10 ALT3.ASPMX.L.GOOGLE.COM.
vg.no mail is handled by 5 ALT2.ASPMX.L.GOOGLE.COM.
...但是讓我們處理您的腳本。我看到的第一個問題是,對于每個域,您將dig輸出附加到 tmp.txt,然后對其進行處理。但這意味著當它處理第二個域時,dig第一個域的輸出仍然在 tmp.txt 中(它被附加到,而不是被替換),所以它會再次被處理。然后在第三次迭代中,第一個和第二個域仍然存在,所以它們都被再次處理,等等。
解決方案:要么使用單個>(即> tmp.txt)直接替換內容,要么跳過臨時檔案并將輸出直接通過管道傳輸到awk(或接下來的任何內容)。
第二個問題是awk命令 ,awk -F ';' ' {print $1}'只是在第一個“;”之前列印所有內容 在每一行上。它甚至在以分號開頭或只是空白的行上也列印出來;在這兩種情況下,它都會列印空行。所以你的輸出中有很多空行。此外,在確實具有相關內容的行上,它不會洗掉除 MX 域本身之外的所有額外資料:
vg.no. 300 IN MX 1 ASPMX.L.GOOGLE.COM.
vg.no. 300 IN MX 10 ALT4.ASPMX.L.GOOGLE.COM.
...
您可以修復awk腳本以洗掉空行和不相關的資料,但使用dig short跳過不相關的位會更簡單:
$ dig short mx vg.no
5 ALT2.ASPMX.L.GOOGLE.COM.
1 ASPMX.L.GOOGLE.COM.
10 ALT4.ASPMX.L.GOOGLE.COM.
5 ALT1.ASPMX.L.GOOGLE.COM.
10 ALT3.ASPMX.L.GOOGLE.COM.
要在您的示例中獲得表單中的輸出,您只需要一個簡短的awk程式來洗掉優先級欄位并為正在查找的域名添加前綴:
$ un=vg.no
$ dig short mx "$un" | awk -v un="$un" '{print un " = " $2}'
vg.no = ASPMX.L.GOOGLE.COM.
vg.no = ALT4.ASPMX.L.GOOGLE.COM.
vg.no = ALT1.ASPMX.L.GOOGLE.COM.
vg.no = ALT3.ASPMX.L.GOOGLE.COM.
vg.no = ALT2.ASPMX.L.GOOGLE.COM.
請注意,MX 記錄沒有任何特定順序;如果你希望他們排序優先,加sort -g進之間的管道dig和awk。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/314566.html
上一篇:在運行期間更改在slurm中發送到sbatch的執行(R)腳本
下一篇:提高bash腳本的性能
