【发布时间】:2020-09-02 02:33:35
【问题描述】:
这似乎是一个非常受欢迎的问题,但由于某种原因,我在这里找到的我正在尝试的 awk 解决方案不起作用。
我有一个别名,可以获取我网络上某些设备的信息。我希望能够搜索列表并检索设备“名称”。别名和输出如下所示:
$ mtb devices
Alias Address Name Software Brand
------------------------------------------------------------
192.168.1.107 Device1 1009 Some_brand
TV 192.168.1.103 Device2 0831 Some_other_brand
TV2 192.168.1.105 Device3 0831 Some_brand
在我的脚本中,使用 grep 我可以找到我正在寻找的行,因为我通过 ip 地址进行搜索:
IP=$1
BOX=`mtb devices | grep ${IP}`
echo $BOX
这给了我一个结果:
$ ./my_devices.sh 192.168.1.105
TV2 192.168.1.105 Device3 0831 Some_brand
现在我想从该行中获取“名称”,所以我使用了 awk '{print $3}':
IP=$1
BOX=`mtb devices | grep ${IP} | awk '{print $3;}'`
echo $BOX
$ ./my_devices.sh 192.168.1.105
Device3
但是当我搜索一个没有别名的IP地址时,我显然得到了错误的结果:
$ ./my_devices.sh 192.168.1.107
1009
我寻找了更多的解决方案,我找到了另一个 awk 解决方案,但是新的 awk 不起作用:
IP=$1
BOX=`mtb devices | grep ${IP} | awk '{ for(i=1;i<=NF;i++) if ($i == "$IP") print $(i+1) }'`
echo $BOX
当我运行我的脚本时,它什么也不返回:
$ ./my_devices.sh 192.168.1.105
$
显然我希望它返回Device3。
IP 地址字段和名称字段将始终被填充,但别名字段可能不会被填充。
【问题讨论】:
-
1)代替波浪号,使用以下语法:BOX=$( command )。2)如果您按预期传递变量,您的最后一个 awk 将起作用:mtb devices | awk -v ip="$IP" '{ for(i=1;i<=NF;i++) if ($i == ip) print $(i+1) }'(也省略grep,只有一个命令就足够了,grep 或 awk 或 sed 等) -
我从未听说过
mtb,但是大多数可以在人类可读的表格中生成输出的工具也可以选择以更容易机器可读的格式生成输出 - 你检查过mtb的手册页,看看它是否有这样的选项?