我在这里完全从事理论工作,所以请原谅任何误解。我需要在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
如果将返回值存储在变量中并迭代变量更有效,我也会对该结果持开放态度。提前感谢您的帮助。
答案 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地址模式不匹配。