안녕히 가세요.
/etc/resolv.conf.dnsph에서 추출된 IPv6 주소에서 ping6을 실행하려고 합니다. 그러나 awk는 IPv6 주소를 한 줄로 묶은 것처럼 보입니다.
$ grep ^nameserver /etc/resolv.conf.dnsph |awk '{print $2}'
2001:1890:1001:2224::1
2001:1890:1001:2424::1
$ ping6 $(grep ^nameserver /etc/resolv.conf.dnsph |awk '{print $2}')
ping6: Source routing is deprecated by RFC5095.
Usage: ping6 [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
[-l preload] [-m mark] [-M pmtudisc_option]
[-N nodeinfo_option] [-p pattern] [-Q tclass] [-s packetsize]
[-S sndbuf] [-t ttl] [-T timestamp_option] [-w deadline]
[-W timeout] destination
$ echo $(grep ^nameserver /etc/resolv.conf.dnsph |awk '{print $2}')
2001:1890:1001:2224::1 2001:1890:1001:2424::1
"END {printf "\n"}"를 추가해도 아무런 차이가 없습니다.
$ ping6 $(awk '/^nameserver/ {print $2}; END {printf "\n"}' /etc/resolv.conf.dnsph)
ping6: Source routing is deprecated by RFC5095.
Usage: ping6 [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
[-l preload] [-m mark] [-M pmtudisc_option]
[-N nodeinfo_option] [-p pattern] [-Q tclass] [-s packetsize]
[-S sndbuf] [-t ttl] [-T timestamp_option] [-w deadline]
[-W timeout] destination
$ echo $(awk '/^nameserver/ {print $2}; END {printf "\n"}' /etc/resolv.conf.dnsph)
2001:1890:1001:2224::1 2001:1890:1001:2424::1
조언해주세요.
비요른
답변1
여러 주소가 주어지면 ping6
목적지(마지막 주소)에 도달하기 위한 홉으로 해석합니다. 귀하의 경우 출력을 반복해야 합니다.
for ip in $(awk '/^nameserver/ { print $2 }' /etc/resolv.conf.dnsph); do
ping6 "$ip"
done
AWK는 첫 번째 명령에 표시된 것처럼 각 IP 주소를 한 줄에 올바르게 출력하지만 따옴표는 사용하지 않습니다.명령 대체개행 문자가 효과적으로 제거됩니다. 이는 단어 사이의 구분 기호 역할을 합니다.
답변2
이 $(...)
구성은 명령에 명령줄 인수를 제공하기 위한 것입니다. 명령줄 인수는 줄바꿈이 아닌 공백으로 구분되므로 쉘은 출력을 "최적화"합니다. 하지만 $(...)
다음과 같이 인용할 수 있습니다.
> echo $(echo 1;echo 2)
1 2
> echo "$(echo 1;echo 2)"
1
2
awk
문제는 여전히 연결선과 관련이 없습니다.아니요), 그러나 $(...)
. 을 사용하면 실제로 작업을 수행 awk
할 수도 grep
있으며 awk '/^nameserver/ {print $2}' /etc/resolv.conf.dnsph
내부에서 ping을 호출하여 쉘 루프를 피할 수도 있습니다.for
awk
awk '/^nameserver/ { system("ping6 " $2); }' /etc/resolv.conf.dnsph