Chinaunix首页 | 论坛 | 博客
  • 博客访问: 127463
  • 博文数量: 23
  • 博客积分: 560
  • 博客等级: 中士
  • 技术积分: 215
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-07 22:58
文章分类

全部博文(23)

文章存档

2012年(6)

2011年(17)

分类: LINUX

2012-04-26 20:39:02

       因最近需要对大量的accesslog进行IP归属地分析,一些网页上的分析效率太低,而且每次只能分析500个IP,根本满足不了我的需求,所以自己写了一个IP归属地分析脚本。
一、去下载纯真IP地址数据库
    1) --> 下载 --> 纯真IP地址数据库
    2) 解压,打开IP.exe
    点解压就可以获取到IP及归属地址的txt文本,保存为ip_zone.txt
二、 对ip_zone.txt进行改造并导入到数据库
    1)先对ip_zone.txt进行编码转换
            用记事本打开,然后选另存为,改成UTF-8


2) 因ip_zone.txt要导入数据库并且能准确的定位,改照是必不可少的
            a) 将ip_zone.txt上传到linux服务器上
            b) 将ip_zone.txt改照成我们需要 导入数据库的格式

点击(此处)折叠或打开

  1. cat ip_zone.txt |sed 's/\./ /g'|awk '{printf "%03d%03d%03d%03d,%03d%03d%03d%03d,%s%s\n",$1,$2,$3,$4,$5,$6,$7,$8,$9,$10}' > a.txt

3) 修改my.cnf
            安装数据库就不说了,修改my.cnf
                        将max_connections修改为2000

4)创建数据库及表


点击(此处)折叠或打开

  1. create database ip_zone;
  2.                 use ip_zone;
  3.                 CREATE TABLE `ip_zone` (
  4.   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  5.   `begin` varchar(255) NOT NULL,
  6.   `end` varchar(255) NOT NULL,
  7.   `zone` varchar(255) NOT NULL,
  8.   UNIQUE KEY `id` (`id`),
  9.   KEY `begin` (`begin`),
  10.   KEY `end` (`end`)
  11. ) ENGINE=MyISAM AUTO_INCREMENT=381085 DEFAULT CHARSET=utf8;
5) 将txt文本load入数据库

点击(此处)折叠或打开

  1. load data LOCAL infile '/root/a.txt' into table ip_zone fields terminated by ',' (begin,end,zone);
6) 测试一下IP归属是否成功8.8.8.8

点击(此处)折叠或打开

  1. select zone from ip_zone where begin <= '008008008008' and end >= '008008008008';
  2. +------------------------------------------------------------+
  3. | zone |
  4. +------------------------------------------------------------+
  5.  |美国加利福尼亚州山景市谷歌公司DNS服务器
  6. +------------------------------------------------------------+
  7. 1 row in set (0.00 sec)

基本没有问题了

三、写个脚本调用数据库


点击(此处)折叠或打开

  1. vim check_ip.sh
  2. #!/bin/bash
  3. #create by wenlin.kuang 2012-04-26
  4. cat $1|sort|while read line
  5. do
  6. (b=`echo "$line"|sed 's/\./ /g'|awk '{printf("%03d%03d%03d%03d\n", $1,$2,$3,$4)}'`
  7. echo "$line#`mysql -u用户名 -p密码 ip_zone -N -e "select zone from ip_zone where begin<='"$b"' and end>='"$b"'" `" >> $1_zone.txt )&
  8. c=$(expr $c + 1)
  9.        if [ "$c" -eq "500" ];then
  10.                 sleep 1
  11.                 c=0
  12.         fi
  13. done

四、测试脚本是否运行OK
随便输入些IP到一个test.txt文本里面,一行一个IP
vim test.txt
8.8.8.8
202.96.128.86
61.144.56.100
202.96.134.133

sh check_ip.sh test.txt
 会生成一个test.txt_zone.txt 内容如下
8.8.8.8#美国加利福尼亚州山景市谷歌公司DNS服务器
61.144.56.100#广东省广州市电信ADSL
202.96.134.133#广东省深圳市福田区电信
202.96.128.86#广东省广州市电信IDC机房



阅读(3319) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

邝文琳2012-05-10 23:24:23

今天将数据库升级到5.5.23-2-log,出现异常
1)  load data local 在这个版本使用不了,只能使用load data
2)  导入数据库后出现乱码,load data需要加上字符编码
解决方法:  将a.txt 拷贝到 数据库目录下面,指定字符编码
一(5) 改为
load data infile 'a.txt' into table ip_zone CHARACTER SET utf8 fields terminated by ',' (begin,end,zone);