다음과 같은 파일이 있습니다.
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 루프를 반복하는 동안 핑을 통해 각 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
핑만 수신되지만 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가 더 효율적일 수 있지만 익숙하지 않습니다)