2016-09-29 87 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',所以功能上绝对为零。 –