sh/bash/dash/ksh/zsh等Shell脚本
-
yohu
- 帖子: 955
- 注册时间: 2006-12-18 17:04
- 来自: 福建泉州
#1
帖子
由 yohu » 2013-08-10 22:27
我需要一个linux脚本,用来整理ip库,我从纯真ip库里面分离出来的txt,大概格式如下
代码: 全选
58.60.35.0 58.60.35.255 广东省深圳市 电信
58.60.36.0 58.60.37.255 广东省深圳市龙岗区 电信
58.60.38.0 58.60.49.17 广东省深圳市 电信
58.60.49.18 58.60.49.18 广东省深圳市南山区 西丽镇麻堪村麻堪网络会所
58.60.49.19 58.60.50.255 广东省深圳市 电信
58.60.51.0 58.60.51.255 广东省深圳市南山区 电信
58.60.52.0 58.60.52.255 广东省深圳市 电信
58.60.53.0 58.60.56.255 广东省深圳市福田区 电信
58.60.57.0 58.60.60.50 广东省深圳市 电信
58.60.60.51 58.60.60.51 广东省深圳市 科技园深南花果纵横E代网吧
58.60.60.52 58.60.63.50 广东省深圳市 电信
58.60.63.51 58.60.63.51 广东省深圳市 深南花园纵横E代网吧
58.60.63.52 58.60.63.192 广东省深圳市 电信
58.60.63.193 58.60.63.219 广东省深圳市 深圳大学
58.60.63.220 58.60.70.255 广东省深圳市 电信
58.60.71.0 58.60.73.255 广东省深圳市宝安区 电信
58.60.74.0 58.60.74.255 广东省深圳市宝安区 /南山区ADSL
58.60.75.0 58.60.79.255 广东省深圳市 电信
58.60.80.0 58.60.80.255 广东省深圳市罗湖区 电信
58.60.81.0 58.60.81.255 广东省深圳市 电信
58.60.82.0 58.60.85.255 广东省深圳市宝安区 电信
58.60.86.0 58.60.96.255 广东省深圳市福田区 电信
58.60.97.0 58.60.99.255 广东省深圳市 电信
58.60.100.0 58.60.100.255 广东省深圳市罗湖区 电信ADSL
58.60.101.0 58.60.105.12 广东省深圳市 电信
58.60.105.13 58.60.105.13 广东省深圳市龙岗区 平湖米老鼠网吧
58.60.105.14 58.60.105.41 广东省深圳市 电信
58.60.105.42 58.60.105.42 广东省深圳市龙岗区 坂田镇国惠康商场旁博文网吧
58.60.105.43 58.60.105.60 广东省深圳市 电信
58.60.105.61 58.60.105.61 广东省深圳市龙岗区 布吉汇福花园三楼源源昊网吧
58.60.105.62 58.60.105.96 广东省深圳市 电信
58.60.105.97 58.60.105.97 广东省深圳市龙岗区 布吉镇骏龙网吧
58.60.105.98 58.60.105.98 广东省深圳市 骏龙网吧(永通店)(布吉街乐民路九矿大厦3楼)
58.60.105.99 58.60.105.160 广东省深圳市 电信
我需要转换一下格式,转换成192.168.1.0/24这样的格式,后面文字说明不要,里面有些单独ip,如果是整个网段连续的就整理成一个/24,不连续就另外保存到其他文件,还有一些跨网段的掩码。
比如
代码: 全选
58.60.60.52 58.60.63.50 广东省深圳市 电信
58.60.63.51 58.60.63.51 广东省深圳市 深南花园纵横E代网吧
58.60.63.52 58.60.63.192 广东省深圳市 电信
58.60.63.193 58.60.63.219 广东省深圳市 深圳大学
58.60.63.220 58.60.63.255 广东省深圳市 电信
直接转换成
或者不用跨网段掩码,全部搞成/24就行了。
-
cao627
- 帖子: 992
- 注册时间: 2007-12-05 10:57
- 系统: ubuntu14.04
- 来自: 金山
#2
帖子
由 cao627 » 2013-08-11 10:48
能不能只从纯文本修改的逻辑的角度说一下你的需求。
-
eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
#3
帖子
由 eexpress » 2013-08-11 11:08
是根据3列的中文,判断归属/合并1/2列?
● 鸣学
-
yohu
- 帖子: 955
- 注册时间: 2006-12-18 17:04
- 来自: 福建泉州
#4
帖子
由 yohu » 2013-08-11 12:50
不用理会中文,只要合并ip就可以了,合并成192.168.1.0/24这样的格式就可以了。就是需要一个判断,是否网段是完整的,如果完整就合并,全部转成/24就可以了。
举例
代码: 全选
58.60.57.0 58.60.60.50 广东省深圳市 电信
58.60.60.51 58.60.60.51 广东省深圳市 科技园深南花果纵横E代网吧
58.60.60.52 58.60.63.50 广东省深圳市 电信
58.60.63.51 58.60.63.51 广东省深圳市 深南花园纵横E代网吧
58.60.63.52 58.60.63.192 广东省深圳市 电信
58.60.63.193 58.60.63.219 广东省深圳市 深圳大学
58.60.63.220 58.60.70.255 广东省深圳市 电信
上面这些就是完整的网段,刚好就是58.60.57.0-58.60.70.255。
所以就整理成
代码: 全选
58.60.57.0/24
58.60.58.0/24
58.60.59.0/24
58.60.60.0/24
58.60.61.0/24
58.60.62.0/24
58.60.63.0/24
58.60.64.0/24
58.60.65.0/24
58.60.66.0/24
58.60.67.0/24
58.60.68.0/24
58.60.69.0/24
58.60.70.0/24
如果不完整,例如
代码: 全选
58.60.57.0 58.60.60.50 广东省深圳市 电信
58.60.60.51 58.60.60.51 广东省深圳市 科技园深南花果纵横E代网吧
58.60.60.52 58.60.63.50 广东省深圳市 电信
58.60.63.51 58.60.63.51 广东省深圳市 深南花园纵横E代网吧
58.60.63.193 58.60.63.219 广东省深圳市 深圳大学
58.60.63.220 58.60.70.255 广东省深圳市 电信
那就整理成
代码: 全选
58.60.57.0/24
58.60.58.0/24
58.60.59.0/24
58.60.60.0/24
58.60.61.0/24
58.60.62.0/24
58.60.63.1
58.60.63.2
58.60.63.3
58.60.63.4
.......单个ip连续列到51
58.60.63.51
58.60.63.193
58.60.63.194
58.60.63.195
.......单个ip列到结束
58.60.63.255
58.60.64.0/24
58.60.65.0/24
58.60.66.0/24
58.60.67.0/24
58.60.68.0/24
58.60.69.0/24
58.60.70.0/24
最完美就是逐一列出ip,如果不行的话另保存为一个文件,我再手动整理。
-
yohu
- 帖子: 955
- 注册时间: 2006-12-18 17:04
- 来自: 福建泉州
#5
帖子
由 yohu » 2013-08-11 13:27
其实我整理这个主要是为了做一个bind的acl做分区域解析,我自己已经分离出区域的IP库,但是整理成bind支持的格式,这个很头痛。还有就是bind好像不支持/25 /26以上的掩码,不然可以更精简一些,希望大虾们多多赐教,谢谢。
附件就是我想整理的其中之一的IP库。
-
附件
-
- gd.txt.tar.bz2
- (246.34 KiB) 已下载 56 次
-
yohu
- 帖子: 955
- 注册时间: 2006-12-18 17:04
- 来自: 福建泉州
#6
帖子
由 yohu » 2013-08-12 13:39

崩溃中,继续求援……大虾们出手救救俺吧……
-
eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
#7
帖子
由 eexpress » 2013-08-12 21:48
你这是整理数据。需要排序,判断等各种。如果自己会一种语言,应该可以搞定。这要建立很大的hash表,然后判断处理。
如果是使用ip数据库,不需要搞这些。直接用就是。
● 鸣学
-
yohu
- 帖子: 955
- 注册时间: 2006-12-18 17:04
- 来自: 福建泉州
#8
帖子
由 yohu » 2013-08-12 23:31
eexpress 写了:你这是整理数据。需要排序,判断等各种。如果自己会一种语言,应该可以搞定。这要建立很大的hash表,然后判断处理。
如果是使用ip数据库,不需要搞这些。直接用就是。

看来ee说难我就彻底无解了,网上有找到一个类似的软件,可惜它整理出来的不全,不全就已经百万行了,如果手动整理更不可能了,看来这个计划要难产了。
-
nash142857
- 帖子: 3
- 注册时间: 2013-02-14 23:04
- 系统: linux
#9
帖子
由 nash142857 » 2013-08-26 15:39
代码: 全选
# encoding: utf-8
HASH_NUM = 256
#_to_i 就是把ip华为数字 _to_string 就是把对应的数转化为ip
def _to_i(str)
a, b, c, d = str.split('.').map{|x| x.to_i}
return (((a * HASH_NUM + b) * HASH_NUM + c) * HASH_NUM) + d
end
def _to_string(num)
str = ""
4.times do
tmp = num % HASH_NUM
str = tmp.to_s + "." + str
num /= HASH_NUM
end
return str[0, str.length - 1]
end
#pair 记录每一first_ip 和 second_ip
class Pair
attr_accessor :first, :second
def set(a, b)
@first = a
@second = b
end
end
def deal(st, ed)
head_st = st / HASH_NUM
head_ed = ed / HASH_NUM
tail_st = st % HASH_NUM
tail_ed = ed % HASH_NUM
if(head_st == head_ed)
if(st == 0 && ed == 255)
puts _to_string(st) + "/24"
else
puts _to_string(st)
puts ".......单个ip连续列到" + tail_ed.to_s
puts _to_string(ed)
end
return
end
if(tail_st == 0)
puts _to_string(st) + "/24"
else
puts _to_string(st)
puts ".......单个ip连续列到255"
puts _to_string(head_st * HASH_NUM + 255)
end
(head_st + 1).upto(head_ed - 1) do |x|
puts _to_string(x * HASH_NUM) + "/24"
end
if(tail_ed == 255)
puts _to_string(head_ed * HASH_NUM) + "/24"
else
puts _to_string(head_ed * HASH_NUM)
puts ".......单个ip连续列到" + tail_ed.to_s
puts _to_string(ed)
end
return
end
#处理的时候 先考虑合并。。把相邻的second和下一个first 合并 然后deal(st, ed)
def solve(res)
st = res[0].first
0.upto(res.size - 1) do |i|
if(i != res.size - 1 && res[i + 1].first == res[i].second + 1)
next
end
deal(st, res[i].second)
if(i != res.size - 1)
st = res[i + 1].first
end
end
end
data = Array.new(30010){Pair.new}
count = 0
File.open("gd.txt", "r") do |f|
f.each do |line|
a, b, c = line.split
data[count].set(_to_i(a),_to_i(b))
count += 1
end
end
#首先排序
res = data[0, count].sort{|a, b| a.first <=> b.first}
solve(res)
LZ 这是我刚写的一个ruby脚本处理你那个。。貌似行的,求各位大牛指点。。shell还不在学
-
sarrow
- 帖子: 403
- 注册时间: 2007-10-27 1:04
#10
帖子
由 sarrow » 2013-08-26 19:47
确实,这个问题不难——只要会一种编程语言。
就像ee说的那样,先排序,后面就是一个线性过程了。最多两次循环。处理数据一次,输出一次。
-
aerofox
- 帖子: 1453
- 注册时间: 2008-05-24 8:30
#11
帖子
由 aerofox » 2013-08-29 22:01
能不能直接把它变成一串二进制数,再从左侧比较有多少位相同的?
-
zhw2101024
- 帖子: 1849
- 注册时间: 2009-03-28 16:10
- 系统: Arch debian win7
-
联系:
#12
帖子
由 zhw2101024 » 2013-08-30 11:31
你这个需求要描述清楚了也不是件容易的事,还不如自己学一下ruby,想怎么整就怎么整。