누구나 netstat -rn, while, read 및 cut 명령을 사용하여 기본 IP를 얻을 수 있습니까?

누구나 netstat -rn, while, read 및 cut 명령을 사용하여 기본 IP를 얻을 수 있습니까?

상상할 수 있듯이 가상 머신의 기본 IP를 얻으려면 이 명령을 사용해야 합니다. netstat -rn은 다음 출력을 제공합니다.

Kernel IP routing table
Destination   Gateway        Genmask ...
0.0.0.0       138.248.123.23 ....

138.248.123.23(가상 IP)을 얻어야 하는데 awk나 sed를 사용할 수 없습니다. while 및 read를 사용하여 출력의 세 번째 줄을 얻을 수 있지만, cut 명령을 사용하여 추출할 수는 없습니다. 나는 이것을 시도했지만 netstat -rn | cut -f2 -d$'\t'성공하지 못했습니다 ...

답변1

내가 그것을 따를지는 모르겠지만, 이것은?

# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 enp0s25
0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 wlp3s0
172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 docker0
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 enp0s25
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 wlp3s0
192.168.100.0   0.0.0.0         255.255.255.0   U         0 0          0 virbr1
192.168.122.0   0.0.0.0         255.255.255.0   U         0 0          0 virbr0

# netstat -rn | while read dest gw rest ; do [[ "${dest}" == "0.0.0.0" ]] && echo "${gw}" ; done
192.168.1.1
192.168.1.1

답변2

왜 awk와 sed를 사용할 수 없나요?

또 다른 해결책은 다음과 같습니다.

grep ^0.0.0.0 | tr -s " " | cut -f2 -d" "

-s옵션은 공백 문자열을 단일 공백으로 변환합니다.

답변3

netstat와 shell만 사용하면 다음을 수행할 수 있습니다.

set -- $(netstat -rn)
shift 13
echo $1

하지만 조금 깨지기 쉽습니다.

x=$(netstat -rn | while read a b rest ; do [ a = "0.0.0.0" ] || continue ; echo $b ; break ; done )

더 강해지지만 분명히 더 길어집니다.

관련 정보