답변:
이것을 파일에 저장하고 실행하십시오. bash <filename>
#!/bin/bash
ifconfig eth0 | grep "inet addr"
IP 주소를 보여주는 숫자 만 얻는 것이 더 정확합니다.
#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1
업데이트 : 이것이 효과가 없다면 다른 대답을 시도하십시오.
grep "inet"
다른 옵션을 제공하기 위해 다음과 같은 ip addr
명령을 사용 하여 IP 주소를 얻을 수 있습니다.
ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
ip addr show eth0
에 대한 정보를 보여줍니다 eth0
grep "inet\b"
IPv4 주소가있는 행만 표시합니다 (IPv6 주소를 원하는 경우로 변경 "inet6\b"
).awk '{print $2}'
ipaddress / mask가있는 두 번째 필드에 인쇄합니다 (예 : 172.20.20.15/25
cut -d/ -f1
IP 주소 부분 만 사용합니다.스크립트에서 :
#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
/programming//a/14910952/1695680 에서 가져온
hostname -i
그러나 로컬 IP 주소 (127.0.0.1)를 반환 할 수 있으므로 다음을 사용하고 필터링해야 할 수도 있습니다.
hostname -I
호스트 이름 맨 페이지에서 :
-i, --ip-address
호스트 이름의 네트워크 주소를 표시하십시오. 호스트 이름을 확인할 수있는 경우에만 작동합니다. 이 옵션을 사용하지 마십시오. 대신 hostname --all-ip-addresses를 사용하십시오.
-I, --all-ip-addresses
호스트의 모든 네트워크 주소를 표시하십시오. 이 옵션은 모든 네트워크 인터페이스에서 구성된 모든 주소를 열거합니다. 루프백 인터페이스 및 IPv6 링크 로컬 주소는 생략되었습니다. 옵션 -i와 달리이 옵션은 이름 확인에 의존하지 않습니다. 출력 순서에 대해 어떤 가정도하지 마십시오.
ip addr show label 'enp*'
더 나은,하지만 성가신 구문 분석, 같은 것입니다 ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
방법 꽤 캔 작업 ...
@ markus-lindberg의 답변은 제가 가장 좋아하는 것입니다. -o -4
ip 플래그에 추가 하면 훨씬 더 쉽게 파싱 가능하고 일관된 출력을 얻을 수 있습니다.
ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'
-o
는 --oneline
이러한 종류의 상황에서 정확히 도움을주기위한 것입니다. 는 -4
다른 모든 응답이 의미하는 것입니다 IPv4 주소에 한계에 추가됩니다.
ip
깃발을 사랑하십시오 . cut
고급 awk
마법사 대신 사용 :ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
cut
대해 알게 된 후 "발견" awk
되었으며 파이프 라인의 명령 수를 최소화하는 것을 좋아합니다. 어쨌든 좋은 제안.
여기에 하나의 라이너가 있습니다 .....
어 wk
ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'
위 awk 명령의 split 함수는 구분 기호를 기준으로 두 번째 열을 :
분할하고 분할 된 값을 연관 배열에 저장합니다 a
. a[2]
두 번째 부분의 가치도 마찬가지 입니다.
sed
ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'
기본 sed \(...\)
에서 문자를 캡처하는 데 사용되는 캡처 그룹이라고합니다. 우리는 역 참조를 통해 캡처 된 캐릭터를 참조 할 수 있습니다. \([^[:space:]]\+\)
한 번 이상 공백이 아닌 문자를 캡처합니다.
grep
ifconfig eth0 | grep -oP 'inet addr:\K\S+'
\K
이전에 일치 한 문자가 최종 인쇄시 인쇄 \S+
되지 않고 하나 이상의 공백이 아닌 문자 와 일치합니다.
펄
ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'
inet addr:
문자열 옆에있는 하나 이상의 공백이 아닌 문자 가 캡처되고 마지막으로 캡처 된 문자 만 인쇄합니다.
다음은 좋은 방법입니다. grep 만 보조 명령으로 사용합니다.
ip addr show eth0 | grep -oP 'inet \ K \ S [0-9.] +'
왜 필요한 것보다 많은 명령을 사용해야하는지 모르겠습니다
당신은 사용해야합니다 ip
(대신 ifconfig
그것은 일관성 및 분석 할 수있는 출력을 생성, 스크립팅을 위해 가장 중요한 것은 아마도 유지 그것의 현재로)합니다. 다음은 몇 가지 유사한 접근법입니다.
이더넷 인터페이스에 IPv4 주소를 원하는 경우 eth0
:
$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24
스크립트로 :
$ INTFC=eth0
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}')
$ echo $MYIPV4
192.168.1.166/24
위에서 생성 된 출력은 CIDR 표기법으로되어 있습니다. CIDR 표기법을 원하지 않으면 제거 할 수 있습니다.
$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1
192.168.1.166
IMHO가 "가장 우아하다"는 다른 옵션은 지정된 원격 호스트 (이 경우 8.8.8.8)에 연결하는 데 사용되는 모든 인터페이스의 IPv4 주소를 가져옵니다. 이 답변 에서 @gatoatigrado의 예의 :
$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166
스크립트로 :
$ RHOST=8.8.8.8
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166
이는 단일 인터페이스가있는 호스트에서 완벽하게 작동하지만 여러 인터페이스 및 / 또는 경로 사양이있는 호스트에서도 더 유리하게 작동합니다.
하지만 ip
내 선호 된 접근을 할 것, 그것은 확실히이 고양이를 피부 할 수있는 유일한 방법이 아니다. hostname
더 쉽고 간결한 것을 선호하는 경우 사용 하는 또 다른 방법이 있습니다.
$ hostname --all-ip-addresses | awk '{print $1}'
또는 IPv6 주소를 원하는 경우 :
$ hostname --all-ip-addresses | awk '{print $2}'
스크립트로 :
$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}')
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166
$ echo $MYV6IP
2601:7c1:103:b27:352e:e151:c7d8:3379
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
이것은 단지 사용 ip addr
하는 대체 ifconfig
및 awk
교체 (GSUB)와 결합.
ifconfig eth0|grep 'inet '|awk '{print $2}'
일반 사용자도 사용할 수 있습니다.
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
대신의 조합으로 두 번 awk
과 cut
출력을 구문 분석 할 수 있습니다. 다음에 다른 모든 답변을 먼저 확인하고 중복 된 솔루션을 게시하지 않아야합니다. 이 경우에는 중복인지 또는 비슷한 지 논쟁의 여지가 있으므로 일반적인 힌트로 사용하십시오. 감사.
이것이 내가 찾을 수있는 가장 짧은 방법입니다.
ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'
$1
네트워크 인터페이스로 교체하십시오 .
ip -f inet
ip에게 inet (ipv4) 제품군의 값만 반환하도록 지시합니다.
grep -Po
grep에게 다음 값을 perl-regex로 해석하고 일치하는 값만 인쇄하도록 지시합니다.
정규 표현식 \K[\d.]+
은 "이 시점까지 모든 것을 버리고 (\ K) 가능한 한 많은 숫자 값과 한 행의 점을 찾습니다"라고 말합니다. 따라서 이것은 IP 주소와 만 일치하며 짧은 \ XX 서브넷 마스크를 포함하여 그 이후의 모든 것을 무시합니다.
요즘에는 다중 인터페이스 (예 : 도커를 사용하는 경우)가 있고 ETH의 인터페이스 이름 지정은 더 이상 표준이 아닙니다.
이 명령을 사용하여 IP / Mask를 추출합니다.
IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)
따라서 내가 가진 인터페이스 수와 이름에 관계없이 GREP은 MULTICAST 옵션을 가진 첫 번째 인터페이스 만 가져옵니다.
이 명령을 사용하여 마스크없이 IP 만 추출합니다.
IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)
나는 다른 BDS & NIX 에서이 명령을 사용합니다.
ip
하려면 -o
옵션을 사용하십시오 .
내 스크립트에서 나는 다음과 같은 것을 사용하고 있습니다 :
re="inet[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"
if [[ $(ip addr show eth0) =~ $re ]]; then
echo ${BASH_REMATCH[1]}
else
echo "Cannot determin IP" 1>&2
fi
프로세스를 생성하지 않습니다.