Bash Script: подсчет уникальных строк в файле

Вопрос: Ситуация: У меня есть большой файл (миллионы строк), содержащий IP-адреса и порты из нескольких сетевых захватов, один ip/порт на строку. Строки имеют такой формат: ip.ad.dre.ss[:port] Желаемый результат: Существует запись для каждого пакета, который я получил при регистрации, поэтому существует много дубликатов адресов. Я хотел бы иметь возможность запускать это через оболочку script, которая сможет

Вопрос: Ситуация:

У меня есть большой файл (миллионы строк), содержащий IP-адреса и порты из нескольких сетевых захватов, один ip/порт на строку. Строки имеют такой формат:

ip.ad.dre.ss[:port] Желаемый результат:

Существует запись для каждого пакета, который я получил при регистрации, поэтому существует много дубликатов адресов. Я хотел бы иметь возможность запускать это через оболочку script, которая сможет свести ее к строкам в формате

ip.ad.dre.ss[:port] count

где count – количество вхождений этого конкретного адреса (и порта). Никакой специальной работы не нужно делать, обрабатывать разные порты как разные адреса.

До сих пор я использую эту команду для очистки всех IP-адресов из файла журнала:

grep -o -E [0-9]+.[0-9]+.[0-9]+.[0-9]+(:[0-9]+)? ip_traffic-1.log > ips.txt

Из этого я могу использовать довольно простое регулярное выражение, чтобы очистить все ip-адреса, которые были отправлены по моему адресу (что меня не волнует)

Затем я могу использовать следующее, чтобы извлечь уникальные записи:

sort -u ips.txt > intermediate.txt

Я не знаю, как я могу как-то сгруппировать число строк.

Лучший ответ:

Вы можете использовать команду uniq, чтобы получить количество отсортированных повторяющихся строк:

sort ips.txt | uniq -c

Чтобы получить самые частые результаты на вершине (спасибо Питеру Джарику):

sort ips.txt | uniq -c | sort -bgr Ответ №1

Для подсчета общего количества уникальных строк (т.е. без учета дублирующих строк) мы можем использовать uniq или Awk с wc:

sort ips.txt | uniq | wc -l awk ‘!seen[$0]++’ ips.txt | wc -l

Awk-массивы являются ассоциативными, поэтому они могут работать немного быстрее, чем сортировка.

Генерация текстового файла:

$ for i in {1..100000}; do echo $RANDOM; done > random.txt $ time sort random.txt | uniq | wc -l 31175 real 0m1.193s user 0m0.701s sys 0m0.388s $ time awk ‘!seen[$0]++’ random.txt | wc -l 31175 real 0m0.675s user 0m0.108s sys 0m0.171s

Оцените статью
Добавить комментарий