команда фильтр grep

задача:
в файле содержащем текст и ip адреса вывести только уникальные адреса (команды grep, uniq)

Текст:

        test 127.0.0.1 test test
        # this is 192.196.31.12 ip addr
        8.8.8.8
        dns ad127.0.0.1dr

Результат:

        127.0.0.1
        192.196.31.12
        8.8.8.8

Помогите решить, по строкам, спасибо большое


Ответы (4 шт):

Автор решения: PotroNik
grep -oP '(?<=[^0-9]|^)(?:1?[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9])\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(?:1?[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9])(?=[^0-9]|$)' /file ...

Далее нужно выполнить сортировку по значениям, иначе unuq не сработает и объединяет только подряд идущие идентичные записи, сделать это можно командой sort

... | sort | uniq

Но у sort есть параметр выбрать сразу уникальные записи и команда в целом будет выглядеть так:

grep -oP '(?<=[^0-9]|^)(?:1?[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9])\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(?:1?[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9])(?=[^0-9]|$)' /file | sort -u

Регулярное выражение (?<=[^0-9]|^)(?:1?[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9])\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(?:1?[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9])(?=[^0-9]|$) сделал что бы выбирать валидный ip адрес, проще конечно проверять каждый октет на < 256
Пример работы: https://regex101.com/r/ob48gv/3
начала диапазона 1.0.0.1 и до 255.255.255.255

→ Ссылка
Автор решения: pwnz

cat text.txt | grep -oE "\b([0-9]{1,3}.){3}[0-9]{1,3}\b" | sort --unique

→ Ссылка
Автор решения: Andrew Bystrov
grep -Po '[0-9]+.[0-9]+.[0-9]+.[0-9]+' file | sort | uniq
→ Ссылка
Автор решения: alash

Возможно, в парсере ошибка или особенность. У меня не сработало на IP-адресе 45.61.130.0

Пришлось поправить в последнем поле: (?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5]|[1-9])(?=[^0-9]|$) — теперь работает ({1,2} вместо бывшего ранее {2}).

Решение:

grep -oP '(?<=[^0-9]|^)(?:1?[0-9]{2}|2[0-4][0-9]|25[0-5]|[1-9])\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5]|[1-9])(?=[^0-9]|$)' /file | sort -u

→ Ссылка