다음 명령을 실행했습니다.
ip addr | grep -En 'inet (([0-9]*\.){3}[0-9]*)/24' | awk '{print "LAN:" $3 }'
결과가 "192.168.123.245/24"인데 이것이 아닌 이유는 무엇입니까 192.168.123.245
?
또 다른 질문은3달러를 써야 해요대신 ip를 인쇄하세요 $1
.
답변1
해당 부분 없이 명령을 실행해 보면 awk
무엇이 필요한지 알 수 있습니다 $3
.
ip addr | grep -En 'inet (([0-9]*\.){3}[0-9]*)/24'
어떤 명령도 awk
당신에게 그런 일을 주지 않을 것입니다.
11: inet 192.168.1.26/24 brd 192.168.1.255 scope global dynamic noprefixroute wlp1s0
21: inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
첫 번째 열이 행 번호 11:
이고 임을 알 수 있습니다 21:
. 그런 다음 inet
세 번째 열은 마스크된 IP 번호입니다. grep으로 무엇을 하든, IP 번호에는 항상 넷마스크가 추가됩니다. 넷마스크를 제거하려면 sed
찾은 행을 변경하는 다른 것을 사용해야 합니다. Grep은 찾은 내용만 표시합니다.
이 시도:
ip addr | grep -En 'inet (([0-9]*\.){3}[0-9]{1,3})/24' | awk '{print "LAN:" $3 }' | sed -En 's/(LAN:.*)\/24/\1/p'
좀 더 우아하게 할 수 있을 것 같아요.
답변2
이렇게 하면 트릭을 수행할 수 있습니다.
ip addr | grep 'inet.*\/24' | grep -oE '(([0-9]*\.){3}[0-9]*)' | awk '{ print "LAN:"$1 }'
먼저 grep을 사용하여 /24 네트워크로 라인을 캡처합니다. 다음으로 IPv4 주소와 일치하면 -o
arg는 grep에게 문자열의 일치하는 부분만 인쇄하도록 지시합니다. awk는 문자열 시작 부분의 "LAN:"을 대체합니다.
이제 코드 조각이 요청한 대로 작동하는 이유에 대해 알아보세요. 키 가 없으면 -o
grep은 전체 문자열을 인쇄한 다음 awk는 공백으로 구분된 세 번째 "단어"인 세 번째 "인수"를 인쇄합니다.