У меня есть текстовый файл с тремя столбцами / полями: время, 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
Просто 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
ls -l
, например, цели ссылка, не место назначения... должны быть способы осмотреть саму ссылку. – alexis 7 September 2018 в 11:03