Ситуация:
У меня есть большой файл (миллионы строк), содержащий IP-адреса и порты из нескольких часов сетевого захвата, по одному IP / порту на строку. Строки имеют следующий формат:
ip.ad.dre.ss[:port]
Желаемый результат:
Есть запись для каждого пакета, который я получил во время регистрации, поэтому существует много повторяющихся адресов. Я хотел бы иметь возможность запускать это через какой-то сценарий оболочки, который сможет сократить его до строк формата
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
Я не знаю, как я могу каким-то образом агрегировать количество строк с помощью sort.
-bgr
совпадению выглядит мнемоника дляbigger
, чего мы и хотим наверху..bashrc
или.bash_aliases
файла:function countuniquelines () { sort "$1" | uniq -c | sort -bgr; }
. Позвоните черезcountuniquelines myfile.txt
.sort -nr
.Чтобы подсчитать общее количество уникальных строк (т.е. без учета повторяющихся строк), мы можем использовать
uniq
или Awk сwc
:Массивы AWK ассоциативны, поэтому он может работать немного быстрее, чем сортировка.
Создание текстового файла:
источник
Это самый быстрый способ подсчитать количество повторяющихся строк и красиво их распечатать, перейдя от наименее частых к наиболее частым:
Если вас не волнует производительность и вы хотите что-то более легкое для запоминания, просто запустите:
PS:
sort -n анализирует поле как число, это правильно, поскольку мы выполняем сортировку по счетчикам.
источник
!
in{!seen[$0]++}
является избыточным, поскольку мы печатаем только вEND
.