문자열에서 마지막 패턴 찾기

문자열에서 마지막 패턴 찾기

grep -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}를 사용하여 IP 주소에 대한 로그 파일 줄을 구문 분석하려고 합니다. . [0-9]{1,3}'이며 주어진 각 행의 마지막 IP 주소만 추출하려고 합니다.

구문 분석할 두 줄의 예:

Via: SIP/2.0/UDP 78.41.207.101:5237;branch=z9hG4bK-577783956;rport=5237
Via: SIP/2.0/UDP 127.0.0.1:5079;branch=z9hG4bK-1014230957;rport=5079;received=194.126.22.146

나는 얻는다 :

78.41.207.101
127.0.0.1
194.126.22.146

내가 원하는 것:

78.41.207.101
194.126.22.146

귀하의 도움에 감사드립니다.

답변1

이 sed를 사용해 볼 수 있습니다

sed -E 's/.*[^0-9](([0-9]{1,3}\.){3}[0-9]{1,3}).*/\1/' infile

설명하다:

-E 확장 정규식을 사용합니다.
-E가 없으면 다음과 같이 명령을 작성해야 합니다.

sed 's/.*[^0-9]\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*/\1/' infile

(([0-9]{1,3}.){3}[0-9]{1,3})는 RE와 동일합니다.

<-------> !  
    1     3 time

'[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}'

<---------><---------><--------->

   1       2       3

첫 번째 부분 .*[^0-9] 은 탐욕적입니다.
줄의 마지막 정규식 앞의 모든 항목과 일치합니다.
마지막 .*는 줄의 끝과 일치합니다.

답변2

이 경우에는 awk를 사용하고 싶습니다.

$ awk '{print $NF}' FPAT="[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}" file1
78.41.207.101
194.126.22.146

FPAT필드를 정의하는 데 사용되는 구성(grep -o 모드와 동일)은
$NF각 줄의 마지막 필드입니다.

답변3

대부분의 정규식 기계는 욕심 모드를 사용합니다. 즉, 최대한 일치합니다. 그래서 이와 같은 것이 ^.*[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+일치 할 것입니다까지 포함마지막 IPv4 주소. 그것을 잡아.

관련 정보