Я бы использовал что-то вроде:
perl -MRegexp::Common -wnE 'say for /$RE{net}{IPv4}/g' log-file > another-file
Это потребует от вас установки Perl-модуля Regexp::Common
, если он не поставляется вместе с вашей ОС. Переключатель -n
заставляет его перебирать строку за строкой по входному файлу; затем он будет перебирать каждое вхождение IP-адреса и выводить каждый из этих IP-адресов в отдельную строку. Модуль Regexp::Common
будет иметь шаблон, соответствующий IP-адресам, который доступен в $RE{net}{IPv4}
.
Я использовал awk для помещения IP-адресов в ассоциированный массив с именем "i", используя совпадение в качестве индекса. Затем я печатаю индексы, которые дедуплицируют данные.
awk 'match($0, /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) {i[substr($0,RSTART,RLENGTH)]=1}END{for(ip in i){printf("%s\n", ip)}}' sourcefile
Вероятно, самым простым способом будет простой grep:
grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" /path/to/sourcefile > output.txt
Это позволит извлечь все IP-адреса из исходного файла и записать их в файл output.txt, разделив их новой строкой.