Bash

Ping 文件中的 IP

  • November 5, 2022

我的文件包含以下數據,我正在使用腳本來解析和執行 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列印值PingingNotPinging。如果你想列印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

引用自:https://unix.stackexchange.com/questions/723735