регулярное выражение grep, которое соответствует всем действительным адресам IPv4 и IPv6

Эти ошибки означают, что ОС распознает вашу команду как попытку установить nvidia и установить текущую... Итак, не находит ни одну из этих двух и не может установить.

1 )попробуйте с nvidia -текущий (с тире между)

2 )Если с вашим компьютером все в порядке без каких-либо драйверов (, но с открытым исходным кодом по умолчанию ), НЕ УСТАНАВЛИВАЙТЕ НИКАКИХ. Это не окна... В Linux, поскольку вы используете более закрытый исходный код, у вас больше возможностей рано или поздно столкнуться с проблемами.

1
09.02.2020, 14:55
2 ответа

Альтернативный подход, не основанный на -grep, perl, с использованием Regexp ::Общий пакет (Доступен как порт 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
28.04.2021, 23:24

Поскольку ваша операционная система (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.

2
28.04.2021, 23:24

Теги

Похожие вопросы