如何管理CLI返回信息以运行相同的命令

时间:2016-11-25 18:57:25

标签: bash ssh pipe

我在这里完全从事理论工作,所以请原谅任何误解。我需要在bash命令返回的每一行上运行相同的命令,但只使用该命令的一部分返回。请注意,这是自定义命令行返回。例如:

// initial command
> ~$ device findAll
// returned data
Scanning ...
Network Name   Hardware Address     IPV4 Address    Details
test1          CD:F8:D4:15:3B:AE    172.1.3.22     "Blah Blah Blah"
test1          AB:C1:D2:11:31:EF    192.15.31.2    "Blah Blah Blah"
...
test1          CE:A8:B4:16:3A:FD    172.1.6.21     "Blah Blah Blah"
test1          AC:B1:E2:16:21:DF    172.1.6.22     "Blah Blah Blah"
Total: 600 Devices

使用此返回的数据,我只需要访问每行的IPV4地址部分,这样我就可以进入设备并运行更新。我知道如何单独ssh到每个设备,但有600个返回值,这将浪费时间。我也不知道如何忽略标题行和返回数据的总行。

我的问题是:如何仅使用命令行访问返回数据的IPV6部分?

最终结果理论上会是这样的:

> ~$ device findall | while read -r line ; do
    //access device by ssh command
    scp /current-firmware-pathway/firmware.bin user@**[IPV4 Value Here]**:/tmp/fwupdate.bin
done 

如果将返回值存储在变量中并迭代变量更有效,我也会对该结果持开放态度。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

使用awk非常容易:

device findall | awk '$3 ~ /^[0-9]+(\.[0-9]+){3}$/ { print $3 }' | while read ip; do
    scp /current-firmware-pathway/firmware.bin user@$ip:/tmp/fwupdate.bin
done 

使用$3 ~ /^[0-9]+(\.[0-9]+){3}$/我们过滤线条, 匹配由点分隔的4个非空数字序列。 这不是严格的IPv4地址模式, 但可能足够接近。 如果匹配,我们打印第3列。 标题和摘要行被忽略, 因为它们与第3列中的IP地址模式不匹配。