스크립트에서 grep -oP.... 이해하기

스크립트에서 grep -oP.... 이해하기

저는 데비안용 작은 bash 스크립트를 작성 중입니다. IPv4의 세 번째 옥텟을 찾아 "ip1" 변수에 푸시하고 마지막 옥텟을 "ip2" 변수에 푸시하고 싶습니다. 몇 가지 조사 끝에 첫 번째 옥텟을 제공해야 하는 스크립트를 찾았지만 이 부분을 이해하지 못합니다.

'(?<=inet )[^.]+' 

누군가 나에게 이것을 설명하고 내 필요에 맞게 조정할 수 있는 방법을 설명할 수 있습니까?

나는 이것을 읽었다https://explainshell.com/…그래서 -oP가 어떻게 작동하는지 알지만 여전히 마지막 부분을 이해하지 못합니다.

ip1=$(ip a show | grep -oP '(?<=inet )[^.]+')
ip2=$(ip a show | grep -oP '(?<=inet )[^.]+')

답변1

-Pgrep이는 Perl 정규식 구문을 사용해야 함 을 의미합니다 . Perl에서는 (?<=pattern)"너비가 0인 긍정적인 LookBehind 어설션", 즉 일치 항목 자체 앞에 나타나야 하는 앵커입니다. 따라서 앵커가 뒤따르는 경우 일치 (?<=inet )[^.]+항목은 마침표()가 아닌 비어 있지 않은 문자의 시퀀스, 즉 해당 IP 주소 중 첫 번째입니다. 출력 라인이 바이트 네트워크 인터페이스이기 때문입니다.[^.]+"inet "ip address showinet 127.0.0.1/8 scope host lo

-o이는 옵션이 출력 일치를 만들고 일치에 중요하더라도 해당 비트가 인쇄되는 것을 grep원하지 않기 때문에 수행됩니다 ."inet "

문제는 다양한 IP 주소의 첫 번째 바이트만으로 무엇을 할 수 있는지, 그리고 ip2ip1. 스크립트는 어떤 용도로 사용되나요?

특정 요구 사항에 따라 다음과 같은 예를 들 수 있습니다.

# get last two bytes of IP (assume in 192.168.*. network)
last_two=$(ip a show | grep -oP '(?<=inet 192\.168\.)[^/]+')
# Split result in two
IFS=. read net host <<< $last_two

관련 정보