Bash 如何解析和转换ip数据库?

Bash 如何解析和转换ip数据库?,bash,awk,Bash,Awk,我有这样的ip数据库(apnic): inetnum: 218.75.100.64 - 218.75.100.67 netname: YONGKANG-SHIJI-NETBAR country: CN descr: Yongkang Shiji Internet Bar descr: NULL admin-c: XY203-AP tech-c: CJ54-AP status: ASSIGNED NON-P

我有这样的ip数据库(apnic):

inetnum:      218.75.100.64 - 218.75.100.67
netname:      YONGKANG-SHIJI-NETBAR
country:      CN
descr:        Yongkang Shiji Internet Bar
descr:        NULL
admin-c:      XY203-AP
tech-c:       CJ54-AP
status:       ASSIGNED NON-PORTABLE
changed:      auto-dbm@dcb.hz.zj.cn 20040610
mnt-by:       MAINT-CN-CHINANET-ZJ-JH
source:       APNIC

inetnum:        218.75.99.0 - 218.75.99.3
netname:        WEISHENG-COLTD
country:        CN
descr:          Donggan Hospital
descr:
admin-c:        DS1202-AP
tech-c:         CJ54-AP
mnt-irt:        IRT-CHINANET-ZJ
status:         ASSIGNED NON-PORTABLE
changed:        zjnoc_ip_5@163.com 20150510
mnt-by:         MAINT-CN-CHINANET-ZJ-JH
source:         APNIC
...
218.75.100.64;218.75.100.67;YONGKANG-SHIJI-NETBAR;CN;Yongkang Shiji Internet Bar;APNIC
218.75.99.0;218.75.99.3;WEISHENG-COLTD;CN;Donggan Hospital;APNIC
...
我需要转换为csv文件(仅ipstart-ipend-netname-country-descr1-source),如下所示:

inetnum:      218.75.100.64 - 218.75.100.67
netname:      YONGKANG-SHIJI-NETBAR
country:      CN
descr:        Yongkang Shiji Internet Bar
descr:        NULL
admin-c:      XY203-AP
tech-c:       CJ54-AP
status:       ASSIGNED NON-PORTABLE
changed:      auto-dbm@dcb.hz.zj.cn 20040610
mnt-by:       MAINT-CN-CHINANET-ZJ-JH
source:       APNIC

inetnum:        218.75.99.0 - 218.75.99.3
netname:        WEISHENG-COLTD
country:        CN
descr:          Donggan Hospital
descr:
admin-c:        DS1202-AP
tech-c:         CJ54-AP
mnt-irt:        IRT-CHINANET-ZJ
status:         ASSIGNED NON-PORTABLE
changed:        zjnoc_ip_5@163.com 20150510
mnt-by:         MAINT-CN-CHINANET-ZJ-JH
source:         APNIC
...
218.75.100.64;218.75.100.67;YONGKANG-SHIJI-NETBAR;CN;Yongkang Shiji Internet Bar;APNIC
218.75.99.0;218.75.99.3;WEISHENG-COLTD;CN;Donggan Hospital;APNIC
...
如何使用awk或bash实现这一点?

使用awk,您可以做到:

awk -F ':[[:blank:]]*' '/inetnum:/{ip=$2; sub(/ +- +/, ";", ip)} /netname:/{nn=$2}
   /country:/{ct=$2} ds=="" && /descr:/{ds=$2}
  /source:/{print ip, nn, ct, ds, $2; ds=""}' OFS=";" file
输出:

218.75.100.64;218.75.100.67;YONGKANG-SHIJI-NETBAR;CN;Yongkang Shiji Internet Bar;APNIC
218.75.99.0;218.75.99.3;WEISHENG-COLTD;CN;Donggan Hospital;APNIC

这将忽略第二个
descr
字段。

您打算忽略第二个
descr
字段,还是将
NULL
作为特例处理?忽略。我只需要先描述一下。谢谢。在一般情况下,解析
whois
是一项永无止境的工作,因为不同的数据库使用不同的字段和不同的数据库格式,甚至在单个数据库中,某些字段的语义似乎随着时间的推移而发生了变化。