Bash
Ping 文件中的 IP
我的文件包含以下數據,我正在使用腳本來解析和執行 ping 並顯示輸出,我遇到了腳本問題,請協助。
File.txt 包含以下數據:
Server ProdTerminalA 192.168.132.10 Server ProdTerminalB 192.168.132.11 Server ProdTerminalC 192.168.132.12 Server ProdTerminalD 192.168.132.13 Server DevTerminalA 192.168.131.10 Server DevTerminalB 192.168.131.11 Server DevTerminalC 192.168.131.12 Server DevTerminalD 192.168.131.13 Server TestTerminalA 192.168.133.10 Server TestTerminalB 192.168.133.11 Server TestTerminalC 192.168.133.12 Server TestTerminalD 192.168.133.13
我正在解析 DevTerminal 並通過解析數據 ping IP,但沒有得到預期的輸出。
grep "Dev" file.txt | while read ip; do ping -c2 $ip > /dev/null 2>&1 && echo -en "\t Pinging\n" || echo -en "\t NotPinging\n"; done
預期結果應顯示:
DevTerminalA 192.168.131.10 Status (Pinging or NotPinging) DevTerminalB 192.168.131.11 Status (Pinging or NotPinging) DevTerminalC 192.168.131.12 Status (Pinging or NotPinging) DevTerminalD 192.168.131.13 Status (Pinging or NotPinging)
我認為這就是您要尋找的東西:
#!/bin/bash grep "Dev" file.txt | while read data; do ip=$(awk '{print $3}' <<< "$data") name=$(awk '{print $2}' <<< "$data") echo -en "$name\t$ip" ping -c2 $ip > /dev/null 2>&1 && echo -en "\t Pinging\n" || echo -en "\t NotPinging\n"; done
我不列印,而是
Status
列印值Pinging
或NotPinging
。如果你想列印Status
之前你應該在該行中使用它echo -en "$name\t$ip"
:echo -en "$name\t$ip\tStatus"
您的主要問題是
$ip
變數,因為它不僅包含 ip,還包含以下內容:Server DevTerminalA 192.168.131.10
所以你正在使用:
ping Server DevTerminalA 192.168.131.10
awk
我得到了DevTerminalA ( )$(awk '{print $2}' <<< "$data")
和192.168.131.10 ($(awk '{print $3}' <<< "$data")
)。
您可以使用
read
將每個空格分隔的欄位讀入其自己的變數:#!/bin/bash while read -r class name addr; do if [[ $name != Dev* ]]; then continue fi if ping -c 2 "$addr" >/dev/null 2>&1; then status=Pinging else status=NotPinging fi printf '%s\t%s\tStatus %s\n' "$name" "$addr" "$status" done
該腳本從其標準輸入流中讀取列表。您可以根據需要調整輸出格式。
在我的區域網路上測試:
$ ./script <File.txt DevTerminalA 192.168.131.10 Status NotPinging DevTerminalB 192.168.131.11 Status NotPinging DevTerminalC 192.168.131.12 Status NotPinging DevTerminalD 192.168.131.13 Status NotPinging
同樣的事情,但
awk
改為使用:BEGIN { OFS="\t" } $2 ~ /^Dev/ { if (!system("ping -c 2 " $3 ">/dev/null 2>&1")) status="Pinging" else status="NotPinging" print $2, $3, "Status " status }
請注意,這在技術上包含一個程式碼注入漏洞,因為第三個欄位中的字元串可能被設計為執行任意程式碼(通過簡單地包含一個
;
和另一個 shell 命令)。測試:
$ awk -f script File.txt DevTerminalA 192.168.131.10 Status NotPinging DevTerminalB 192.168.131.11 Status NotPinging DevTerminalC 192.168.131.12 Status NotPinging DevTerminalD 192.168.131.13 Status NotPinging