2013-04-13 2 views
73

положения:

У меня есть большой файл (миллионы строк), содержащие IP-адрес и порты из несколько захвата сети часов, один IP/порта в строку. Линии этого формата:Bash Script: подсчет уникальных строк в файле

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 

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

ответ

196

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

sort ips.txt | uniq -c 

Чтобы получить наиболее частые результаты в верхней части (спасибо Peter Jaric):

sort ips.txt | uniq -c | sort -bgr 
+27

Последующие меры: Я использую это буквально каждый день. Как я выжил без него. – Wug

+12

Я пришел сюда, чтобы проголосовать, но он уже проголосовал за меня. – Worker

+11

Добавьте другой вид, чтобы получить наиболее распространенные результаты сверху: 'sort ips.txt | uniq -c | sort -bgr' –

Смежные вопросы