정규식 일치 결과에 대한 질문

정규식 일치 결과에 대한 질문

다음 명령을 실행했습니다.

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 주소와 일치하면 -oarg는 grep에게 문자열의 일치하는 부분만 인쇄하도록 지시합니다. awk는 문자열 시작 부분의 "LAN:"을 대체합니다.

이제 코드 조각이 요청한 대로 작동하는 이유에 대해 알아보세요. 키 가 없으면 -ogrep은 전체 문자열을 인쇄한 다음 awk는 공백으로 구분된 세 번째 "단어"인 세 ​​번째 "인수"를 인쇄합니다.

관련 정보