로컬 IP 주소가 10.0.0.159인 RHEL 7 시스템에서 다음 명령은 IP를 인쇄합니다 10.0.0.159
.
$ echo "$(ifconfig eth0 | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | \
grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1')""(rw,sync)"
"10.0.0.0/8"을 인쇄하려면 명령을 무엇으로 변경해야 합니까?
답변1
노트: ifconfig
더 이상 사용되지 않는 cmd입니다. cmd를 사용해야 합니다. iproute2 패키지에 있습니다. 아래에서는 ip
교체 도구를 사용하여 원하는 작업을 수행하는 방법을 보여줍니다 .
ifconfig
이 작업을 수행하는 대신 명령을 사용하는 것이 좋습니다 ip
.
IP 네트워크 세그먼트
이 양식은 CIDR 표기법으로 IP 주소를 표시합니다.
$ ip addr list eth0 | awk '/inet.*brd/ {print $2}'
10.0.2.15/24
-or-
$ ip a l eth0 | awk '/inet.*brd/ {print $2}'
10.0.2.15/24
네트워크 세그먼트
이 양식은 CIDR 표기법으로 네트워크 주소를 표시합니다.
$ ip route show | awk '/eth0.*scope/ {print $1}'
10.0.2.0/24
IP 계산
또한 이 ipcalc
명령을 사용하여 위의 주소를 조작하여 다른 형식을 계산할 수도 있습니다. 예를 들어:
$ ipcalc -n $(ip a l eth0 | awk '/inet.*brd/ {print $2}')
NETWORK=10.0.2.0
$ ipcalc -p $(ip a l eth0 | awk '/inet.*brd/ {print $2}')
PREFIX=24
이를 사용 하면 종종 너무 복잡한 텍스트를 구문 분석하기 위해 ipcalc
많은 작업을 수행하지 않고도 원하는 변형을 보다 간단하게 구성할 수 있습니다 sed
.awk
답변2
원하는 대로 명령줄을 변경하려면 먼저 명령줄이 수행하는 작업을 이해해야 합니다. 분석은 다음과 같습니다.
echo "$(<something>)""(rw,sync)"
다른 모든 것은 something
편집 할 일반 텍스트일 뿐입니다.echo
echo
ifconfig eth0
네트워크 정보를 가져옵니다.
grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*'
시스템에서 여러 IP를 격리합니다. 예를 들어, -E
grep에게 정규식을 사용하도록 지시하면 정규식을 사용하여 모든 숫자를 함께 일치시킬 수 있습니다. 기본적으로 grep 조건과 일치하는 전체 줄이 아닌 정규식과 일치하는 부분만 출력하도록 grep에 지시합니다. 따라서 입력 라인이 이면 및 부분을 무시하고 출력만 됩니다.[0-9]*
-o
inet addr:10.0.0.159 Bcast:10.0.0.255 Mask:255.255.255.0
inet addr:10.0.0.159
Bcast
Mask
grep -Eo '([0-9]*\.){3}[0-9]*'
이는 레이블이 없다는 점만 제외하면 위와 완전히 동일합니다. inet addr
이는 IP를 구체적으로 격리하고 레이블을 제거하려는 의미입니다. 마침내,
grep -v '127.0.0.1'
루프백 IP에 관심이 없기 때문에 해당 IP는 출력 목록에서 제거됩니다.
보시다시피 명령은 출력을 가져오고 ifconfig
정보를 필터링하여 원하는 정보만 격리합니다. 어떠한 계산이나 정보 처리도 수행하지 않습니다. 그러나 인쇄하려는 것은 .net이 명시적으로 표시하지 않는 정보인 서브넷과 마스크입니다 ifconfig
. 즉, 원하는 것을 얻기 위해 다른 방식으로 무언가를 필터링할 수는 없습니다. Mask
행 끝에 있는 필드를 사용하여 일부 처리와 계산을 수행 해야 합니다 . 즉, "원하는 내용을 인쇄하도록 명령을 변경"할 수 없습니다. 완전히 다른 명령을 만들어야 합니다.
slm의 답변은 유사한 기술(원하는 정보만 유지하기 위해 정보 필터링)을 사용하지만 입력을 필요한 정보가 포함된 명령으로 변경합니다. :-) 원하는 것을 정확하게 출력하는 명령이 없고 그에 대한 일부 처리를 수행하는 것이 유일한 옵션인 경우 if
향후 예제 또는 기초로 사용할 수 있는 보기 흉한 s 세트가 있습니다. slm의 첫 번째 솔루션을 사용하고 마스크가 항상 8, 16 또는 24라고 가정합니다.
ip a l eth1 | awk '/inet.*brd/ {split($2,add,"/");split(add[1],ip,".");if(add[2]<=24){ip[4]=0} if(add[2]<=16){ip[3]=0} if(add[2]<=8){ip[2]=0} print ip[1]"."ip[2]"."ip[3]"."ip[4]"/"add[2];}'
이 명령은 출력을 ip
ress add
(10.0.0.159)와 마스크(8)로 분할합니다. 그런 다음 IP를 4개의 숫자로 나눕니다. 그런 다음 마스크를 기준으로 숫자를 0으로 설정합니다. 하지만 이는 비트 단위가 아닙니다. 이는 마스크 8, 16, 24만 처리한다는 의미입니다. 왜냐하면 이것이 제가 하드코딩한 것이기 때문입니다. ;)
당신이 가지고 있는 도구에 대해 더 많이 배울 수 있기를 바랍니다. ^_^