在命令结果

时间:2016-09-29 12:53:16

标签: linux bash shell awk

我想在一个命令中获得包含这些字段的列表:

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

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

当前awk命令的正确语法是:

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

但你绝对不需要tail,因为你可以在awk中做NR>2{...}而且很有可能你不需要head但是没有看到原始arp-scan输出我们只能猜测。

另外 - 如果你正在使用awk,那么你可能应该使用shell代替:

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