ファイルからのIP ping

ファイルからのIP ping

私のファイルには次のデータが含まれています。スクリプトを使用して解析し、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

おすすめ記事