awk가 문자열을 다른 줄로 연결하는 이유는 무엇입니까?

awk가 문자열을 다른 줄로 연결하는 이유는 무엇입니까?

안녕히 가세요.

/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을 호출하여 쉘 루프를 피할 수도 있습니다.forawk

awk '/^nameserver/ { system("ping6 " $2); }' /etc/resolv.conf.dnsph

관련 정보