sort, uniq, corte mantendo campos adicionais

1

Eu tenho um arquivo de texto com três colunas / campos: time, endereço de origem ip e tipo (tcp, udp, icmp). Por favor, veja a amostra na parte inferior.

Eu tive que classificar pelo endereço IPsource para determinar os endereços que possuem 100 pacotes ou mais e manter apenas esses endereços. Eu usei cut, uniq, awk para obter algo assim:

149 109.67.66.151
165 110.139.3.179
204 110.4.80.107
112 111.118.55.173
169 111.240.103.56

Mas no processo perdi o campo tcp / udp / icmp. Existe uma maneira de manter este campo para o endereço IP correspondente e obter algo como:

149 109.67.66.151  TCP
165 110.139.3.179  UDP
204 110.4.80.107   TCP
112 111.118.55.173 ICMP
169 111.240.103.56  TCP

Exemplo de arquivo original:

1385940727.551004 111.8.17.50 TCP
1385940735.434301 111.8.17.50 TCP
1385940739.646539 111.8.17.50 TCP
1385940755.767752 111.8.17.50 TCP
1385940758.258988 111.8.17.50 TCP
1385940762.911809 111.8.17.50 TCP
1385940791.310308 111.8.17.50 TCP
1385940807.928309 111.8.17.50 TCP
1385940828.261464 111.8.17.50 TCP
1385940949.030512 111.8.17.50 TCP
1385936137.681823 111.87.58.139 ICMP
1385936137.692510 111.87.58.139 ICMP
1385936159.164373 111.87.58.139 ICMP
1385936595.854667 111.87.58.139 ICMP
1385936595.865145 111.87.58.139 ICMP
1385936939.448178 111.87.58.139 ICM
    
por MaryB. 27.11.2016 / 08:12

1 resposta

3

Apenas awk :

awk '{$1=""; a[$0]++} END{for (i in a) if (a[i]>=100) print a[i]i}' file.txt
  • Criando o array a com chaves como campos que tornam o primeiro campo nulo e os valores como contagem dos campos (chaves)

  • No END , as chaves e os valores são impressos onde o valor é >=100

Combinação de ferramentas comuns (como você estava usando):

cut -d' ' -f2- file.txt | sort | uniq -c | awk '$1 >= 100'
  • cut -d' ' -f2- file.txt obtém do segundo campo separado por espaços até o final

  • sort classifica o conteúdo

  • uniq -c obtém a contagem

  • awk '$1 >= 100' obtém as linhas em que o primeiro campo (contagem) é >=100

Exemplo: Usando o limite como 10:

% cat file.txt                         
1385940727.551004 111.8.17.50 TCP
1385940735.434301 111.8.17.50 TCP
1385940739.646539 111.8.17.50 TCP
1385940755.767752 111.8.17.50 TCP
1385940758.258988 111.8.17.50 TCP
1385940762.911809 111.8.17.50 TCP
1385940791.310308 111.8.17.50 TCP
1385940807.928309 111.8.17.50 TCP
1385940828.261464 111.8.17.50 TCP
1385940949.030512 111.8.17.50 TCP
1385936137.681823 111.87.58.139 ICMP
1385936137.692510 111.87.58.139 ICMP
1385936159.164373 111.87.58.139 ICMP
1385936595.854667 111.87.58.139 ICMP
1385936595.865145 111.87.58.139 ICMP
1385936939.448178 111.87.58.139 UDP
1385936939.448178 111.87.58.139 UDP

% awk '{$1=""; a[$0]++} END{for (i in a) if (a[i]>=10) print a[i]i}' file.txt
10 111.8.17.50 TCP

% cut -d' ' -f2- file.txt | sort | uniq -c | awk '$1 >= 10'
     10 111.8.17.50 TCP
    
por heemayl 27.11.2016 / 08:22