команда фильтр 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 шт):
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
cat text.txt | grep -oE "\b([0-9]{1,3}.){3}[0-9]{1,3}\b" | sort --unique
Возможно, в парсере ошибка или особенность. У меня не сработало на 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