grep 정규식은 모든 유효한 IPv4 및 IPv6 주소와 일치합니다.

grep 정규식은 모든 유효한 IPv4 및 IPv6 주소와 일치합니다.

grepIPv4 및 IPv6 주소가 포함된 임의 파일에서 IPv4 및 IPv6 주소를 필터링 하는 정규식을 찾고 있습니다 . IPv4 주소가 다음과 같이 작동하길 원합니다:

grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"

여기에 몇 가지 유사한 질문과 답변이 있다는 것을 알고 있지만 대부분은 IPv4 주소와내가 찾은 최고의 답변나에게는 효과가 없습니다. 이 표현식을 사용하면 어떤 IP 주소도 출력되지 않습니다 grep.

질문이 명확하지 않기 때문에 결합된 정규식을 찾고 있습니다. 유효한 IP 주소가 출력됩니다. 보너스로 한 줄에 여러 개를 넣을 수도 있습니다.

어떤 이유로 이것이 쉽지 않다면 grep, 나는 간단하고 BSD 시스템에서 작업하며 GNU 도구가 필요하지 않은 한 대안을 열려고 합니다.

답변1

대체 비 grep기반 perl방법 사용정규식::공통패키지(FreeBSD 포트 이름으로 제공됨 p5-Regexp-Common):

perl -MRegexp::Common=net -nE 'say $& while /$RE{net}{IPv4}|$RE{net}{IPv6}/g' input.txt

예:

$ cat input.txt
some words
a line with 127.0.0.1 and 192.168.1.1 in it.
more words
some line with ::1 in it.
$ perl -MRegexp::Common=net -nE 'say $& while /$RE{net}{IPv4}|$RE{net}{IPv6}/g' input.txt
127.0.0.1
192.168.1.1
::1

답변2

운영 체제(FreeBSD)에는 기본적으로 (모든 Unix 시스템과 마찬가지로) 컴파일러와 어휘 분석기가 함께 제공되므로 아무도 모드를 이해할 수 없는 형편없는 정규 표현식보다는 이를 사용하여 작은 프로그램을 작성하는 것이 더 좋습니다.

$ cat > ipv46.l <<'EOT'
%{
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
%}
W       [0-9A-Za-z_]+
I4      ([0-9]+[.]){3}[0-9]+
I6      ([0-9a-fA-F]|::)[0-9a-fA-F:]*{I4}?
%%
{I6}|{I4} {
        struct in6_addr a6; struct in_addr a; char b[INET6_ADDRSTRLEN];
        if(inet_pton(AF_INET6, yytext, &a6))
                printf("%s\n", inet_ntop(AF_INET6, &a6, b, sizeof b));
        else if(inet_pton(AF_INET, yytext, &a))
                printf("%s\n", inet_ntop(AF_INET, &a, b, sizeof b));
}
{W}|.|\n    ;
EOT

$ lex ipv46.l && cc lex.yy.c -o ipv46 -ll
$ ./ipv46 <file

$ ./ipv46
::0:0:1 1:::1 ::
::1
::
::FFFF:127.0.0.1:80
::ffff:127.0.0.1
...

127.0.0.1이는 매우 엄격합니다. 또는 에서 foo127.0.0.1.12주소를 추출 하지 않습니다 foo:127.0.0.1bar. 그러나 tcpdump address.port형식이나 일반적인 형식 에서 이를 추출할 수 있으며 ipv4:port"혼합" ipv4/ipv6 주소를 처리할 수 있습니다.

답변3

그러면 IPv4 및 IPv6 주소가 추출됩니다.

grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}'

그러나 IPv6 주소에는 1개 이상의 주소가 포함될 수 있으므로 실제로 유효한지 여부는 확인하지 않습니다 ::.

답변4

IPv4에 대한 오류 검사 기능이 있어야 하며 더 간결해야 합니다.

grep -Eo '([0-255]\.){3}[0-255]|([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4}'

관련 정보