Как постоянно контролировать количество вхождений, проходящих через трубу

У меня есть сценарий, который захватывает пакеты и выводит 2-значный код страны, связанный с вновь найденным IP-адресом.

Я хочу отслеживать количество пакетов для каждой страны и делать это непрерывным образом во время захвата пакетов.

Выходной сигнал uniq -c – это именно то, что мне нужно, но я хочу, чтобы он менялся со временем и обновлялся при чтении вывода на трубе.

Вот мой сценарий:

 #!/bin/bash ngrep |grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | while read i do whois $i | grep -i 'Country' | sed 's/Country:[ ]*//I' done 

Вы понимаете, что вы делаете как минимум два запроса whois (так отправляя еще много пакетов и загружая один или несколько серверов whois) для каждого пакета, который проходит через сетевой интерфейс?

Здесь я бы использовал tshark предполагая, что база данных геолокации IP-адресов установлена ​​и правильно настроена:

 tshark -lq -T fields -e ip.geoip.src_country -e ip.geoip.dst_country | gawk -F '\t' -v clear="$(tput clear)" ' BEGIN{PROCINFO["sorted_in"] = "@ind_str_asc"} { count[$1 ? $1 : "Unknown"]++ count[$2 ? $2 : "Unknown"]++ printf "%s", clear for (c in count) printf "%5d %s\n", count[c], c }' 

Вы можете использовать watch :

 ./your_script > countries.txt watch "sort countries.txt | uniq -c" 

Чтобы ускорить работу, которую вы могли бы сделать:

 ./your_script | awk '{seen[$0]++; for(c in seen) printf("%s:%d ", c,seen[c]); printf("\n")}' >countries.txt watch "tail -n 1 countries.txt | tr ' ' '\n'" 

BTW вместо whois вы можете попробовать geoiplookup .