フィルタに基づいてホストをpingし、死んだ状態または生きている状態に戻す

フィルタに基づいてホストをpingし、死んだ状態または生きている状態に戻す

ディレクトリ内のテキストファイルから複数のホストをpingできるスクリプトを作成しようとしています。ホストには特定の命名規則があり、グループ化されます。たとえば、テキストファイルから

10.10.10.10 XX-YY_ZZ name of the host in form of URL 

ファイルはCSVではなくtxtです。

私がしたいのは、次のような結果を返す簡単なことです。pingme YYYY特定の場所に属するデバイス間の共通要素はどこにありますか?)

XX-YY_ZZ = ALIVE

おそらくとても簡単です。しかし、私たちはLinux REDHATを実行しているので、どうやって始めるべきかわかりません。

どんなアドバイスやアイデアにも感謝します。

答え1

私はこれがあなたが望むことをすると信じています:

pingme () {
hostfile="/home/jbutryn/test/hostfile.txt"
IFS= mapfile -t  hosts < <(cat $hostfile)
for host in "${hosts[@]}"; do
    match=$(echo "$host" | grep -o "\-$1_" | sed 's/-//' | sed 's/_//')
    if [[ "$match" = "$1" ]]; then
        hostname=$(echo "$host" | awk '{print $2}')
        ping -c1 -W1 $(echo "$host" | awk '{print $1}') > /dev/null
        if [[ $? = 0 ]]; then
            echo "$hostname is alive"
        elif [[ $? = 1 ]]; then
            echo "$hostname is dead"
        fi
    fi
done
}

次のように関数を実行できます。次 pingme UR01のような結果を返す必要があります。

[root@JBCLAMP001 test]# pingme CC
BB-CC_DD is dead
AA-CC_EE is alive
[root@JBCLAMP001 test]# pingme DD
CC-DD_EE is dead
CC-DD_JJ is alive

答え2

終了コードを使用して、pingpingが成功したか失敗したかを確認できます。

ping HOST -c1 > /dev/null && echo "ALIVE" || echo "DEAD"

ホストがアクティブな場合は終了コードは 0 で、ホストが終了すると終了コードは 1 です。各ホストをpingするには、各行を繰り返してそれを使用して、awkアドレス/ホスト名を含む最初の列を取得できます。

exec 3<input.txt

while read -u3 line
do
    if [ "$line" == "" ]; then
        # skip empty lines
        continue
    fi

    ping -c1 $(echo "$line"| awk '{print $1}') > /dev/null

    if [ $? = 0 ]; then
        echo "$line=ALIVE"
    else
        echo "$line=DEAD"
    fi
done

編集する:

ファイル内で1行だけ一致させてホストをpingするには、次のようにgrepします。

# find line for $host, only 1 line
line = grep "$HOST" input.txt |tail -n 1

# $($line |awk '{print $1}') outputs the first column of line (address)
ping -c1 $($line |awk '{print $1}') >/dev/null && echo "$line=ALIVE" || echo "$line=DEAD"

関連情報