sort, uniq, cut сохраняя дополнительные поля

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

Мне пришлось отсортировать по IP-адресу источника, чтобы определить те адреса, которые имеют 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
1
задан 28 November 2016 в 16:17

1 ответ

Просто awk:

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

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


Комбинация общих инструментов (поскольку Вы использовали):

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

  • sort сортирует содержание

  • 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
3
ответ дан 28 November 2016 в 16:17
  • 1
    Действительно! Также ls -l, например, цели ссылка, не место назначения... должны быть способы осмотреть саму ссылку. – alexis 7 September 2018 в 11:03

Другие вопросы по тегам:

Похожие вопросы: