同じファイルの2つの場所をスクリプトとして出力した後、

同じファイルの2つの場所をスクリプトとして出力した後、

次のファイルがあります。

Sender Bob IP 10.1.1.1
Sender Alex IP 10.1.1.2
Sender Jim IP 10.1.1.3

このような10行、同じ形式です。名前とIPをエコーする必要があります。私はIPのforループを繰り返しながら、pingを通して各IPをテストしています。

これまで私はこれをすることができました:

THEIP=$(cat /tmp/files/extract.txt | awk '{print $4}')
THEID=$(cat /tmp/files/extract.txt | awk '{print $2}')
extract='/tmp/files/Extracted.txt'
for i in $THEIP;
do
        echo "[INFO:]Pinging IP: $i"
        check=$(ping -w 1 $i)
                if [ $? != 0 ] ; then
                echo "[WARN:] **//sender\\** is offline"
                else
                echo "[INFO:] $i Pingable!"
                fi
done

pingだけが受信されますが、IPに関連付けられている送信者を印刷することはできません。私はそれを完全に無視していることを知っており、$THEIDそれを実装する方法がわからないからです。

ネストされたforループ - IP1 +すべての送信者を印刷してからIP2 +すべての送信者を印刷するので、私の目的は失われます。

私のエコーは次のようになります。

[INFO:] - Sender Bob from IP 10.1.1.1 is pingable
[INFO:] - Sender Alex from IP 10.1.1.2 is pingable

など。

答え1

正確に何を達成したいのかは不明ですが、次のように動作できます。

Edit1: Glenn のコメントにより改善されました。

Edit2: ループ内部のコード補完

input="/tmp/files/extract.txt"
while read _ id _ ip; do # iterate over the lines
  echo -n "Pinging $id @ ip $ip... "
  if ping -w 1 $ip 2>&1 >/dev/null; then 
    echo OK
  else
    echo NOPE
  fi
done < "$input"

(bashバージョンのみ、awkはより効率的ですが、慣れていません)

関連情報