текстовая обработка для преобразования десятичной нотации IPv4 в формат /8 или /16

92
13

У меня есть входной файл, содержащий список ip-адресов и ip_counts (некоторый параметр, который я использую внутренне). Файл выглядит примерно так.

202.124.127.26  2135869
202.124.127.25 2111217
202.124.127.17 2058082
202.124.127.16 2014958
202.124.127.20 1949323
202.124.127.24 1933773
202.124.127.27 1932076
202.124.127.22 1886466
202.124.127.18 1882955
202.124.127.21 1803528
202.124.127.23 1786348
119.224.129.200 1776592
119.224.129.211 1639325
202.124.127.19 1479198
119.224.129.201 1145426
202.49.175.110 1133354
119.224.129.210 1119525
68.232.45.132 1085491
119.224.129.209 1015078
131.203.3.8 857951
202.162.73.4 817197
207.123.58.125 785326
202.7.6.18 762603
117.121.253.254 718022
74.125.237.120 710448
68.232.44.219 693002
202.162.73.2 671559
205.128.75.126 611301
119.161.91.17 604393
119.224.129.202 559930
8.27.241.126 528862
74.125.237.152 517516
8.254.9.254 514341

Поскольку вы можете видеть, что ip-адреса сами являются несортированными. Поэтому я использую команду sort в файле для сортировки IP-адресов, как показано ниже.

cat address_count.txt | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n > sorted_address.txt

Это дает мне вывод с IP-адресами в отсортированном порядке. Частичный вывод этого файла показан ниже.

4.23.63.126    15731
4.26.254.254 320705
4.27.8.254 25174
8.12.129.50 176141
8.12.223.125 11800
8.19.32.65 15854
8.19.240.53 11013
8.19.240.70 11915
8.19.240.72 31541
8.19.240.73 23304
8.20.213.28 96434
8.20.213.32 108191
8.20.213.34 170058
8.20.213.39 23512
8.20.213.41 10420
8.20.213.61 24809
8.26.195.253 28568
8.27.152.253 104446
8.27.233.125 115856
8.27.235.126 16102
8.27.235.254 25628
8.27.238.254 108485
8.27.240.125 169262
8.27.241.126 528862
8.27.241.252 197302
8.27.248.125 14926
8.254.9.254 514341
12.129.210.71 89663
15.192.45.21 20139
15.192.45.26 35265
15.193.0.148 10313
15.193.113.29 40318
15.201.49.136 14243
15.240.238.52 57163
17.250.248.95 28166
23.33.125.13 19179
23.33.125.37 17953
31.151.163.60 72709
38.99.42.37 192356
38.99.68.180 41251
38.99.68.181 10272
38.104.237.74 74012
38.108.112.103 37034
38.108.112.115 69698
38.108.112.121 92173
38.108.112.122 99230
38.112.63.238 39958
38.119.130.62 42159
46.4.28.22 19769

Теперь я хочу проанализировать приведенный выше файл и преобразовать его в формат aaa.bbb.ccc.0/8 и формат aaa.bbb.0.0/16, а также хочу подсчитать количество вхождений ip в каждой подсети. хочу сделать это с помощью bash.I открыта для использования sed или awk. Как я могу это достичь.

Например

8.19.240.53    11013
8.19.240.70 11915
8.19.240.72 31541
8.19.240.73 23304
8.20.213.28 96434
8.20.213.32 108191
8.20.213.34 170058
8.20.213.39 23512
8.20.213.41 10420
8.20.213.61 24809

Часть входных данных должна давать 8.19.240.0/8 и 8.20.213.0/8 и аналогично для /16 доменов. Я также хочу подсчитать количество компьютеров в подсети. Например, в приведенном выше выводе эта подсеть должна иметь счетчик 4 в следующем столбце рядом с ним. Он также должен добавить уже отображаемое count.ie(11013 + 11915 + 31541 + 23304) в другой столбец.

8.19.240.0/8 4 (11013 + 11915 + 31541 + 23304) 8.20.213.0/8 6 (96434 + 108191 + 170058 + 23512 + 10420 + 24809)

Было бы здорово, если бы кто-то мог предложить какой-то способ достичь этого.

спросил(а) 2012-06-09T07:10:00+04:00 8 лет, 3 месяца назад
1
Решение
69

Это может сработать для вас:

awk '{a=$1;sub(/\.[^.]*$/,"",a);ac[a]++;at[a]+=$2};END{for(x in ac)print x".0/8",ac[x],at[x]}' file

Это печатает '0/8 адреса '0/8 чтобы получить дубликат кода 0/16 то есть b=a;sub(/\.[^.]*$/,"",b);ba[b]++ т.д. И т.д.,

ответил(а) 2012-06-09T09:49:00+04:00 8 лет, 3 месяца назад
69

Основная проблема здесь заключается в том, что без наличия таблицы маршрутизации с отдельных моментов, когда пакеты прибыли, вы не представляете, какой netblock они были изначально. Конечно, вы можете поместить их в класс-полные блоки, в которых они были бы, в классе -полная ситуация с маршрутизации, но все, что даст вам, - хорошая презентация (и, по общему признанию, более короткий файл).

Кроме того, ваш пример выглядит немного сломанным. У вас есть множество IP-адресов в 8.0.0.0/8, и вы объединяете их в то, что выглядит как 24 маршрута, и представляя их с /8 в конце.

Тем не менее, в awk вы можете использовать sub() для выполнения замены текста (или вы можете использовать индекс для поиска вхождений., Или вы можете использовать split для разделения в точках). Из этого следует относиться довольно легко, чтобы "отбросить последнюю цифру, добавить строку" 0/24 "и использовать ее в качестве ключа для обновления IP-счетчика и словарного счета, затем отбросить последние два октета и слэш, заменить на "0.0/16" и сделать то же самое "(все массивы в awk являются ассоциативными массивами, поэтому, по существу, dicts). Не нужно сортировать заранее, когда вы зацикливаете результат, вы получите ключи в случайном порядке, но в среднем их будет меньше, поэтому сортировка впоследствии будет дешевле.

Кажется, у меня нет awk, поэтому я не могу привести пример кода.

ответил(а) 2012-06-09T09:29:00+04:00 8 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема