grep은 ipv4를 줄이 아닌 단어로 찾습니다.

grep은 ipv4를 줄이 아닌 단어로 찾습니다.

파일에서 ipv4를 찾아야 합니다. 문제는 같은 줄에 다른 단어 IP가 있으면 스크립트가 이를 인쇄하지 않는다는 것입니다. 이것은 내 스크립트입니다.

#!/bin/bash


if [ -e ip.txt ]
then
    grep -E '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$' ip.txt
else
    echo "file not found"
fi

이제 이와 같은 것이 있으면 스크립트는 IP를 인쇄하지 않습니다.

198.54.34.6 text

답변1

명령에서 및를 제거 ^하고 grep 명령의 플래그를 사용하십시오. 즉:$-o

grep -Eo '(^| )(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])($|[[:space:]])'

예:

echo 'some text 198.54.34.6 and test' | grep -Eo '(^| )(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])($|[[:space:]])'

출력은 다음과 같습니다

 198.54.34.6

공백이 생기고, tr예를 들어 공백을 제거해 보십시오 command1 | tr -d " ".

답변2

^그리고 $줄의 시작과 끝에서 각각 일치하므로 IP 주소가 있는 줄은 줄의 시작과 끝 모두에 있는 경우에만 일치합니다. 즉, IP 주소가전체 라인.

이제 전체 IP 주소가 포함된 행을 일치시키려면단어, 어디성격공백으로 구분되어 있으면 다음을 사용할 수 있습니다.

d='[01234567890]'
n="($d|[123456789]$d|1$d$d|2[01234]$d|25[012345])"
grep -E "(^|[[:blank:]])$n\.$n\.$n\.$n([[:blank:]]|\$)" ip.txt

(여기서는 0123456789뿐만 아니라 자주 일치하는 항목 [0-9]으로 대체합니다 .)[0123456789][0-9]

grep출력 되니 참고하세요철사그 게임. 행의 일부만 출력하려면 sed또는 (스트림 편집기)와 같은 것을 사용하거나 GNU의 와 같은 perl일부 구현의 비표준 확장을 사용해야 합니다 .grep-ogrep

여기서는 부정 예측 연산자가 사용됩니다( (?<!\H)의미"공백이 아닌 문자가 앞에 오지 않는 경우", (?!\H)동일하지만 뒤로가 아닌 앞으로 찾고 (?1)첫 번째 그룹의 RE를 호출하면 (...)모든 Perl과 유사한 연산자가 활성화됩니다 -P.

grep -Po '(?<!\H)(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.(?1)\.(?1)\.(?1)(?!\H)' ip.txt

이는 다음과 같습니다.

perl -lne 'print for
  /(?<!\H)(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.(?1)\.(?1)\.(?1)(?!\H)/g'

답변3

-oIPv4만 인쇄하려면 grep 옵션과 일치하는 항목을 추출하면 됩니다 .

더 간단한 예로 다음과 같이 할 수 있습니다.

$ echo "this is a simple test to extract 123.234.34.5 as an IP" | 
       grep -o '[0-9.]*'

123.234.34.5

하지만 이건 실패할 거야정확하게IPv4와 일치합니다.

정규식을 사용하여 IP를 일치시키는 것은 약간 복잡합니다. 정규식은 숫자 범위를 이해하지 못하고 텍스트만 이해합니다. 0-255 사이의 숫자 값을 다음과 일치시킬 수 있습니다(공백과 주석을 무시하는 정규식).

25[012345]                       | # the numers 250 - 255 or
2[01234](?P<digit>[0123456789])  | # 200 - 249 or
1(?&digit){2}                    | # 100 - 199 or
#0?                                 # Allow leading zero
[1-9](?&digit)                   | #  10 -  99 or
#0{0,2}                             # Allow leading zeros
(?&digit)                          #   0 - 9

선행 0을 포함하려면 첫 번째 열 주석을 제거하세요.

중복을 방지하려면 [0-9]명시적인 숫자 범위를 사용하고(다른 언어에서 숫자 일치를 피하기 위해) 일치하는 각 그룹의 이름을 지정하세요. PCRE에서 "이름이 지정된 캡처 그룹"을 사용할 수 있습니다.

(?P<byte>                             # Define this as one full byte value.
25[012345]                          | # the numers 250 - 255 or
2[01234](?P<digit>[0123456789])     | # 200 - 249 or
1(?&digit){2}                       | # 100 - 199 or
#0?                                    # Allow leading zero
[1-9](?&digit)                      | #  10 -  99 or
#0{0,2}                               # Allow leading zeros
(?&digit)                             #   0 - 9
)                                     # close one full byte definition

(\.(?&byte)){3}그런 다음 아래와 같이 선행 점과 일부 선행 및 후행 마커를 사용하여 바이트 정의를 세 번 재사용하면 됩니다.이 링크에 표시됨

\b원하는 경우 선행 및 후행 마커는 더 간단한 "단어 경계"( )가 될 수 있습니다.이 다른 링크에 표시됨

쉘에서 grep PCRE 정규식을 사용하여 명령을 다음과 같이 작성할 수 있습니다.

$ grep -oP '(?xm)(?<=^|[^01234567890.])(?P<byte>25[012345]|2[01234](?P<digit>[0123456789])|[01]?(?&digit){1,2})(\.(?&byte)){3}(?=[^01234567890.]|$)' <<<"$a"
1.2.3.4
11.22.33.44
123.234.34.5
1.1.192.168
123.234.34.123
123.234.34.123
1.2.3.255
255.255.255.255
1.1.168.192
1.14.2.90
1.2.3.4

테스트 문자열에 다음이 포함되어 있다고 가정합니다.

$ a='1.2.3.4
11.22.33.44
123.234.34.5
1.1.192.168
text 123.234.34.123 more text
text123.234.34.123more text
1.2.3.255
1.2.3.256
255.255.255.255
256.2.3.4
1123.234.34.123
123.234.34.1235
.123.234.34.123
123.234.34.123.
not 1.1.168.192 in 1.1.168.192.in-addr.arpa.
not 1.14.2.90 in xserver-common_1.14.2.901-2_all.deb
1.2.3.4'

답변4

이 정규식은 IP 주소를 가져오며 grep -PPCRE 정규식 엔진을 켜고 -o일치하는 텍스트만 반환하는 IPv4 주소에 대한 매우 정확한 정규식입니다.

grep -Po '\b((?:25[0-5]|[2][0-4][0-9]|[1][0-9]{2}|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|[2][0-4][0-9]|[1][0-9]{2}|[1-9][0-9]|[0-9])\b' ip.txt

이 정규식에 대한 설명은 다음을 참조하세요.https://regexr.com/4kjg4

25[0-5]          | # 250 - 255 
[2][0-4][0-9]    | # 200 - 249 
[1][0-9]{2}      | # 100 - 199 
[1-9][0-9]       | #  10 - 99
[0-9]            | #   0 - 9

관련 정보