ファイルからの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

答え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値を印刷します。前に印刷するには、次の行でこれを使用する必要があります。PingingNotPingingStatusecho -en "$name\t$ip"

echo -en "$name\t$ip\tStatus"

主な問題は$ipIPだけでなく、次のような内容も含むため、変数です。

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"))。

関連情報