сортировать, uniq, сократить дополнительные поля

У меня есть текстовый файл с тремя столбцами / полями: время, IP-адрес источника и тип (tcp, udp, icmp). Пожалуйста, смотрите образец внизу.

Мне пришлось сортировать по IPsource-адресу, чтобы определить те адреса, которые имеют 100 пакетов или больше, и только сохранить эти адреса. Я использовал cut, uniq, awk, чтобы получить что-то вроде этого:

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 

Но в этом процессе я потерял поле tcp / udp / icmp. Есть ли способ сохранить это поле для соответствующего Ip-адреса и получить что-то вроде:

 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 

Исходный образец файла:

 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 

Просто awk :

 awk '{$1=""; a[$0]++} END{for (i in a) if (a[i]>=100) print a[i]i}' file.txt 
  • Создание массива a с ключами в качестве полей, делающих первое поле null, и значения в виде количества полей (ключей)

  • В END клавиши и значения печатаются там, где значение >=100


Сочетание общих инструментов (как вы использовали):

 cut -d' ' -f2- file.txt | sort | uniq -c | awk '$1 >= 100' 
  • cut -d' ' -f2- file.txt получает из пространства, разделенного вторым полем до конца

  • сортирует содержимое

  • uniq -c получает счетчик

  • awk '$1 >= 100' получает строки, где первое поле (счет) >=100

Пример: использование порога как 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