파일에서 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
-o
grep
여기서는 부정 예측 연산자가 사용됩니다( (?<!\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
-o
IPv4만 인쇄하려면 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 -P
PCRE 정규식 엔진을 켜고 -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