次のファイルがあります。
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はより効率的ですが、慣れていません)