awk文本处理案例二十六--IP段生成文本列表
【场景】
有大概这样的IP段列表, 111.0.0.0-111.188.255.0 10.0.0.0-99.0.0.0 88.0.0.0-100.0.0.0 复制代码 如何用脚本 生成一文件内容为 111.0.0.0 111.0.0.1 111.0.0.2 111.0.0.3 ... 111.188.255.0
【分析】
题意是:生成两个IP之前IP列表;若IP的前3个是相同的;这样处理就很好解决。其实大家可以仿照之前的工时脚本那篇博客的思路来解决。不过下面的代码更好一点;好在自定义函数的代码。同理之前的工时脚本也可以按照下面的代码思路来写自定义函数
【代码】
function ip2n(ip, n,c){split(ip,a,".");for(c=1;c<=4;c++)n=n*256+a[c];return n}
function n2ip(n, ip,c){ip=n%256;for(c=3;c>0;c--){n=int(n/256);ip(n%256)"."ip}return ip}
BEGIN{FS="-"}{s=ip2n($1);e=ip2n($2);while(s<=e)print n2ip(s++)}'
【测试】
echo 111.0.255.250-111.1.0.5 | awk -F'-' 'function ip2n(ip, n,c){split(ip,a,".");for(c=1;c<=4;c++)n=n*256+a[c];return n}function n2ip(n, ip,c){ip=n%256;for(c=3;c>0;c--){n=int(n/256);ip=(n%256)"."ip}return ip}{s=ip2n($1);e=ip2n($2);[backcolor=Yellow]while(s<=e)[/backcolor]print [backcolor=Cyan]n2ip(s++)[/backcolor]}'
111.0.255.250
111.0.255.251
111.0.255.252
111.0.255.253
111.0.255.254
111.0.255.255
111.1.0.0
111.1.0.1
111.1.0.2
111.1.0.3
111.1.0.4
111.1.0.5
【拓展】
由于我学过postgreSQL。postgreSQL数据库拥有丰富的数据类型;用postgreSQL中的SQL来解决这类问题更好不过了。
postgres=# create table li0924(id int,ip_start inet,ip_stop inet); CREATE TABLE postgres=# insert into li0924 values (1,'192.168.1.240','192.168.2.10'); INSERT 0 1 postgres=# select * from li0924; id | ip_start | ip_stop ----+---------------+-------------- 1 | 192.168.1.240 | 192.168.2.10 (1 row) postgres=# select id, generate_series(0, ip_stop-ip_start)+ip_start as ip_new from li0924; id | ip_new ----+--------------- 1 | 192.168.1.240 1 | 192.168.1.241 1 | 192.168.1.242 1 | 192.168.1.243 1 | 192.168.1.244 1 | 192.168.1.245 1 | 192.168.1.246 1 | 192.168.1.247 1 | 192.168.1.248 1 | 192.168.1.249 1 | 192.168.1.250 1 | 192.168.1.251 1 | 192.168.1.252 1 | 192.168.1.253 1 | 192.168.1.254 1 | 192.168.1.255 1 | 192.168.2.0 1 | 192.168.2.1 1 | 192.168.2.2 1 | 192.168.2.3 1 | 192.168.2.4 1 | 192.168.2.5 1 | 192.168.2.6 1 | 192.168.2.7 1 | 192.168.2.8 1 | 192.168.2.9 1 | 192.168.2.10

浙公网安备 33010602011771号