2016-11-25 19 views
1

我在理論上完全在這裏工作,所以請原諒任何誤解。我需要在bash命令return的每一行上運行相同的命令,但只能使用該命令返回的一部分。請注意,這是自定義命令行返回。例如:如何管道CLI返回信息來運行相同的命令

// 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 [email protected]**[IPV4 Value Here]**:/tmp/fwupdate.bin 
done 

如果存放在變量回歸和迭代變量是更有效,我也開到這一結果。預先感謝您的幫助。

+0

你可以在命令輸出中使用'awk'嗎?你在哪個'殼'?你可以粘貼'設備findAll'的完整輸出,包括存在的頭文件嗎? – Inian

+0

我以前根本不知道awk命令。仔細觀察後,考慮到我的外殼,我可以使用它。 Janos在下面的回答很好,我想是你要去的地方。謝謝! – StrangeTim

回答

0

這是相當容易使用AWK:

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

隨着$3 ~ /^[0-9]+(\.[0-9]+){3}$/我們過濾線,由點分開 匹配4個非空的數值序列。 這不是嚴格的IPv4地址模式, 但可能足夠接近。 如果有匹配,我們打印第3列。 標題和摘要行被忽略, ,因爲它們與第3列中的IP地址模式不匹配。

+0

我以前根本不知道awk命令。仔細觀察後,考慮到我的外殼,我可以使用它。非常感謝你對Janos的快速反應! – StrangeTim