私のファイルには次のデータが含まれています。スクリプトを使用して解析し、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を解析し、データを解析してIPにpingを実行しましたが、期待した出力を取得できませんでした。
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)
答え1
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
スクリプトは標準入力ストリームからリストを読み込みます。必要に応じて出力形式を調整できます。
私のLANでテスト:
$ ./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
}
これには技術的にコード注入の脆弱性が含まれます。 3番目のフィールドの文字列は、(単に1つまたは;
他のシェルコマンドを含む)任意のコードを実行するように設計できるためです。
テスト:
$ 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
答え2
私はこれがあなたが探しているものだと思います:
#!/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
ます。開発端末A($(awk '{print $2}' <<< "$data")
)と192.168.131.10($(awk '{print $3}' <<< "$data")
)。