Situação:
Eu tenho um arquivo grande (milhões de linhas) contendo endereços IP e portas de uma captura de rede de várias horas, um ip / porta por linha. As linhas são deste formato:
ip.ad.dre.ss[:port]
Resultado desejado:
Há uma entrada para cada pacote que recebi durante o logon, portanto há muitos endereços duplicados. Eu gostaria de poder executar isso por meio de um script de shell de algum tipo que possa reduzi-lo a linhas do formato
ip.ad.dre.ss[:port] count
onde count
é o número de ocorrências desse endereço específico (e porta). Nenhum trabalho especial precisa ser feito; trate portas diferentes como endereços diferentes.
Até agora, estou usando este comando para raspar todos os endereços IP do arquivo de log:
grep -o -E [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+(:[0-9]+)? ip_traffic-1.log > ips.txt
A partir disso, posso usar uma regex bastante simples para eliminar todos os endereços IP que foram enviados pelo meu endereço (dos quais não me importo)
Posso então usar o seguinte para extrair as entradas exclusivas:
sort -u ips.txt > intermediate.txt
Não sei como agregar as contagens de linha de alguma forma com a classificação.
-bgr
coincidentemente parece um mnemônicobigger
, que é o que queremos no topo..bashrc
ou.bash_aliases
file:function countuniquelines () { sort "$1" | uniq -c | sort -bgr; }
. Ligue paracountuniquelines myfile.txt
.sort -nr
.Para contar o número total de linhas exclusivas (ou seja, sem considerar linhas duplicadas), podemos usar
uniq
ou Awk comwc
:As matrizes do Awk são associativas, portanto podem ser um pouco mais rápidas que a classificação.
Gerando arquivo de texto:
fonte
Esta é a maneira mais rápida de obter a contagem das linhas repetidas e imprimi-las com muito bom gosto, sendo as menos frequentes as mais frequentes:
Se você não se importa com o desempenho e deseja algo mais fácil de lembrar, basta executar:
PS:
sort -n analisa o campo como um número, isso está correto, pois estamos classificando usando as contagens.
fonte
!
in{!seen[$0]++}
é redundante aqui, pois apenas fazemos a impressão noEND
.