내 파일에는 다음 데이터가 포함되어 있습니다. 스크립트를 사용하여 구문 분석하고 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
}
여기에는 기술적으로 코드 주입 취약점이 포함되어 있습니다. 세 번째 필드의 문자열은 (단순히 하나 ;
또는 다른 셸 명령을 포함하여) 임의의 코드를 실행하도록 설계될 수 있기 때문입니다.
시험:
$ 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
값을 인쇄합니다 . 전에 인쇄하려면 다음 줄에서 이것을 사용해야 합니다 .Pinging
NotPinging
Status
echo -en "$name\t$ip"
echo -en "$name\t$ip\tStatus"
주요 문제는 $ip
IP뿐만 아니라 다음과 같은 내용도 포함하기 때문에 변수입니다.
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")
).