grep
IPv4および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アドレスが出力されます。ボーナスとして1行に複数個入れることもできます。
何らかの理由でこれが簡単でない場合は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
。ただし、tcpdumpaddress.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}'