2016-09-29 117 views
1

我想在短短的命令這些字段列表:添加計算列

IP[TAB]MAC[TAB]VENDOR[TAB]HOSTNAME 

這是我想有結果:

192.168.1.1[TAB]54:a0:50:xx:xx:xx[TAB]ASUSTek COMPUTER INC.[TAB]Router 
192.168.1.2[TAB]60:33:4b:xx:xx:xx[TAB]Apple, Inc.[TAB]iMac-John 
192.168.1.52[TAB]08:ed:b9:xx:xx:xx[TAB]Apple, Inc.[TAB]iMac-Peter 
192.168.1.26[TAB]c0:11:73:xx:xx:xx[TAB]Samsung Electronics Co.,Ltd[TAB]Erik's Android 

我可以用這個命令輕鬆獲得三個第一列:

sudo arp-scan -l | tail -n +3 | head -n -3 

結果:

192.168.1.1[TAB]54:a0:50:xx:xx:xx[TAB]ASUSTek COMPUTER INC. 
192.168.1.2[TAB]60:33:4b:xx:xx:xx[TAB]Apple, Inc. 
192.168.1.52[TAB]08:ed:b9:xx:xx:xx[TAB]Apple, Inc. 
192.168.1.26[TAB]c0:11:73:xx:xx:xx[TAB]Samsung Electronics Co.,Ltd 

的問題是添加的第4列,我試圖用awk命令做,但我得到的結果在一個新行,而不是我喜歡的格式。

sudo arp-scan -l | tail -n +3 | head -n -3 | awk -F '\t' '{ print $0 system("getent hosts " $1) }' 

意外的結果:

192.168.1.1[TAB]Router 
192.168.1.1[TAB]54:a0:50:xx:xx:xx[TAB]ASUSTek COMPUTER INC. 
192.168.1.2[TAB]iMac-John 
192.168.1.2[TAB]60:33:4b:xx:xx:xx[TAB]Apple, Inc. 
192.168.1.52[TAB]iMac-Peter 
192.168.1.52[TAB]08:ed:b9:xx:xx:xx[TAB]Apple, Inc. 
192.168.1.26[TAB]Erik's Android 
192.168.1.26[TAB]c0:11:73:xx:xx:xx[TAB]Samsung Electronics Co.,Ltd 

任何幫助將不勝感激!

+4

[編輯]你的問題,包括簡潔的,可測試的樣品輸入(輸出須藤arp-掃描-l)和預期輸出。 –

+0

推測IP地址是通用密鑰。調查'join'命令。 –

回答

2

您當前awk命令正確的語法是:

awk 'BEGIN { FS=OFS="\t" } 
{ 
    cmd="getent hosts \"" $1 "\"" 
    $0 = $0 OFS ((cmd | getline line) > 0 ? line : "N/A") 
}1' 

但你絕對不需要tail,因爲你可能只是做NR>2{...}在AWK還有就是你不需要head一個很好的機會要麼沒有看到原始arp-scan輸出,我們只能猜測。

而且 - 如果這就是你使用awk做,那麼你或許應該使用外殼來代替:

while IFS=$'\t' read -r ip rest; do 
    printf '%s\t%s\t%s\n' "$ip" "$rest" $(getent hosts "$ip") 
done 
+0

感謝您的回答!我發現在分隔符結尾處的HOSTNAME行不是[TAB],但是具有N/A的行是[TAB],我該如何解決這個問題? –

+1

不客氣,但這是不可能的。該選項卡由位於三元表達式之前的'FS'生成,因此無論主機名稱還是N/A跟隨它,選項卡IS都存在。 \ t「hostname」或「print $ 0」\ t「」N/A「'輸出以'$ 0'\ t」'開頭,無論哪種方式。 FS'應該真的是一個'OFS'順便說一句,所以我即將更新答案,但這只是一個外觀變化,並且由於兩個變量都具有值'\ t',所以功能上絕對爲零。 –