想自己处理网站访问log的ip地址统计分析,因此需要国内用户的ip地址分布,这个可以用纯真ip数据库来进行处理。
1. 下载安装纯真ip数据库
下载地址:纯真ip数据库
纯真ip数据库只支持windows平台,因此需要在虚拟机里进行安装。安装完成后可以选择数据库的导出(导出为文本格式)。
这个导出的文本格式还有点诡异,不能用iconv直接转换编码,最终是用windows下的一个emeditor文本编辑软件进行编码的转换,转换为utf8格式的。
2. 数据格式处理
因为最终是要导入到postgresql数据库中,所以要对导出的utf8文本进行处理,主要是格式上的要求,如常见的csv格式等。
导出的文本格式为:
ip1 ip2 district line
其中主要的分割是空格,但line中自身也包含空格信息。
处理过程如下。
替换空格为分号,在vi中可以如此处理:
:% s/\s\+/;/g
这样做的后果就是将line中的空格也替换成分号了,因此需要再替换回来:
:% s/\(;.\{-}\)\(;.\{-}\)\(;.\{-}\);/\1\2\3 /g
这个命令的主要作用就是将第四个分号替换为空格。因此本命令需要执行多次,直到最终无可替换文本为止。
部分ip地址缺少line属性,因此还需要添加一个空白的文本,否则在导入的时候会出错:
:% s/\([0-9];CZ88\.NET\)$/\1;/g
此命令的作用就是在只有2个分号的地方增加一个结尾分号,即行中以CZ88.NET为结尾,且其前不为ip地址(数字)。
3. 导入到数据库
在数据库中建立一个对应的table,如
CREATE TABLE ipaddress ( id serial NOT NULL, district character varying, line0 character varying, ipstart inet NOT NULL, ipend inet NOT NULL, CONSTRAINT ipaddress_pkey PRIMARY KEY (id ), CONSTRAINT ipaddress_ipstart_key UNIQUE (ipstart ) );
我在建表的时候首先选择ip地址的字段是文本类型的,然后再转换为inet类型的。即通过sql命令导入:
copy ipaddress (ip0,ip1,district,line0) from 'ip.txt' delimiter ';'
这样导入后在转换为inet类型:
update ipaddress set ipstart=inet(ip0),ipend=inet(ip1)
这样就可以利用这个ipaddress表进行相关的查询了。
发表回复