标题: [文本处理] 批处理怎样批量统计所有IP段的IP总数并将数据输出? [打印本页]
作者: wh1234567 时间: 2011-7-1 00:39 标题: 批处理怎样批量统计所有IP段的IP总数并将数据输出?
批处理咋样批量统计txt文本里所有IP段的IP总数并将数据输出?
例如文本1里有:
192.168.1.0 192.168.1.255
222.12.0.0 222.12.255.255
......
处理后并输出的文本2例如:
192.168.1.0 192.168.1.255 小计256个
222.12.0.0 222.12.255.255 小计65536个
......
------------------------------------------------
统计结果总数为:65792个
作者: batman 时间: 2011-7-1 07:26
本帖最后由 batman 于 2011-7-1 07:46 编辑
- @echo off&setlocal enabledelayedexpansion
- (for /f "tokens=1-8 delims=. " %%a in (a.txt) do (
- set /a "a=(%%e-%%a)*(2<<23)+(%%f-%%b)*(2<<15)+(%%g-%%c)*(2<<7)+%%h-%%d+1,num+=a
- echo %%a.%%b.%%c.%%d %%e.%%f.%%g.%%h 小计!a!个
- )
- echo 统计结果总数为:!num!个)>$
- move $ a.txt&start a.txt
复制代码
作者: wh1234567 时间: 2011-7-1 09:32
2# batman
很好,感谢版主,能不能在最后加个------------------------------------------------
每行的数据和最后总计结果用横线分开,这样比较直观
作者: batman 时间: 2011-7-1 10:00
3# wh1234567
我还是保持沉默算了。。。
作者: HAT 时间: 2011-7-1 11:12
- @echo off
- setlocal enabledelayedexpansion
- ( for /f "tokens=1-8 delims=. " %%a in (a.txt) do (
- set /a "sumrow=(%%e-%%a)*(2<<23)+(%%f-%%b)*(2<<15)+(%%g-%%c)*(2<<7)+%%h-%%d+1"
- set /a sumtotal+=sumrow
- echo %%a.%%b.%%c.%%d %%e.%%f.%%g.%%h 小计!sumrow!个
- )
- echo ------------------------------------------------
- echo 统计结果总数为:!sumtotal!个
- )>b.txt
复制代码
作者: batman 时间: 2011-7-1 12:20
相当佩服楼主的是,看到set /a中的运算代码(我是故意写成这样子的)居然都没任何反应?而是着意于最后输出中没有一行-----(我也是故意没写的)。。。
伸手可以伸手成这个样子,倒是难为楼主了。。。
作者: Demon 时间: 2011-7-1 12:43
相当佩服楼主的是,看到set /a中的运算代码(我是故意写成这样子的)居然都没任何反应?而是着意于最后输出中没有一行-----(我也是故意没写的)。。。
伸手可以伸手成这个样子,倒是难为楼主了。。。
batman 发表于 2011-7-1 12:20
在这里提问的大部分都是伸手党吧
作者: CrLf 时间: 2011-7-1 13:50
7# Demon
这是事实,八过大部分人至少会自己解决一些非常简单的、可以模仿的东西,哪怕不懂原理,一些代码的作用猜也猜得出来
作者: wh1234567 时间: 2011-7-1 14:52
5# HAT
感谢网友,我也是和你一样添加了一段echo --------------------------------------------,但结果是在每行里都出现了分割线,哎
作者: HAT 时间: 2011-7-1 19:20
9# wh1234567
可能是超版的for循环写的太具迷惑性,你一不留神把echo写错了地方^_^
作者: temp 时间: 2011-7-1 19:24
相当佩服楼主的是,看到set /a中的运算代码(我是故意写成这样子的)居然都没任何反应?而是着意于最后输出中没有一行-----(我也是故意没写的)。。。
伸手可以伸手成这个样子,倒是难为楼主了。。。
batman 发表于 2011-7-1 12:20
对俺这种水平的人,你写对写错根本分辨不出来,只知道输出的结果是否符合要求,目的达到了错的也认为是对的
我只会模仿,根本不懂代码含义
作者: wh1234567 时间: 2011-7-1 19:38
本帖最后由 wh1234567 于 2011-7-1 19:39 编辑
5# HAT
能不能将每行后面的结果都上下列对齐?
例如
2.2.2.2 2.2.2.22 小计21个
222.222.222.231 222.222.222.255 小计25个
...... 小计xxx个
作者: ArdentMan 时间: 2011-7-1 21:47
借用超版的代码哈:- @Echo Off&SetLocal EnableDelayedExpansion
- Set "Kg= "
- (For /f "Tokens=1-8 Delims=. " %%a in (a.txt) do (
- Set /a "a=(%%e-%%a)*(2<<23)+(%%f-%%b)*(2<<15)+(%%g-%%c)*(2<<7)+%%h-%%d+1,Num+=a
- Set Str1=%%a.%%b.%%c.%%d%Kg%
- Set Str2=%%e.%%f.%%g.%%h%Kg%
- Echo !Str1:~,17!!Str2:~,17!小计!a!个
- )
- Echo -------------------------------------------------------------------------
- Echo 统计结果总数为:!Num!个)>$
- Move $ a.txt&Start a.txt
复制代码
作者: wh1234567 时间: 2011-7-1 23:55
最大可以计算多少位数?我处理后总计结果显示为0,不知道为什么,可以计算上千亿吗?
作者: wh1234567 时间: 2011-7-2 00:04
批处理最大可以计算多少位数
作者: ArdentMan 时间: 2011-7-2 00:13
楼主太不顾及别人的感觉了吧
一个贴子想把所有问题解决了?
另开一个贴子罗~~~~~~~~
作者: wh1234567 时间: 2011-7-2 00:16
本帖最后由 wh1234567 于 2011-7-2 00:21 编辑
不好意思,就这个批处理,只是只能计算8位数的,10位数或更大的就不能计算出来,显示为0
作者: HAT 时间: 2011-7-2 00:32
批处理能直接计算的最大值和最小值
http://bbs.bathome.net/thread-1145-1-1.html
作者: ArdentMan 时间: 2011-7-2 00:54
IP有10位数的?
好像都是0-255吧,最多也只有三位数啊?
作者: wh1234567 时间: 2011-7-2 00:56
5# HAT
你好,你能不能帮我是不是需要修改一下代码?将多行结果相加(正确为4294967296)这么大的结果却计算不出来,显示为0,不知道是啥原因
作者: wh1234567 时间: 2011-7-2 00:58
本帖最后由 wh1234567 于 2011-7-2 01:01 编辑
19# ArdentMan
10位数是指全部IP地址个数相加
作者: ArdentMan 时间: 2011-7-2 01:05
楼上最好给出例子,不然我是不明白你的意思
作者: HAT 时间: 2011-7-2 02:30
方法1:调用VBS计算大数
方法2:调用命令行工具计算大数
方法3:自己编写函数计算大数
作者: ArdentMan 时间: 2011-7-2 11:16
本帖最后由 ArdentMan 于 2011-7-2 11:27 编辑
- Dim FSO, Arr1, Str1, Arr2, Str2, Arr3, Number, Total, Answer
- Dim Num(2)
- Set FSO = CreateObject("Scripting.FileSystemObject")
- Arr1 = Split(FSO.OpenTextFile("a.txt").ReadAll(), vbCrLf)
- For Each Str1 In Arr1
- If Str1 <> vbNullString Then
- Arr2 = Split(Str1, Space(1)) : i = -1
- For Each Str2 In Arr2
- i = i + 1
- Arr3 = Split(Str2, ".")
- Num(i) = Arr3(0) * 256 * 256 * 256 + Arr3(1) * 256 * 256 + Arr3(2) * 256 + Arr3(3)
- Answer = Answer & Str2 & vbTab
- Next
- Number = Num(1) - Num(0) + 1
- Total = Total + Number
- Answer = Answer & "小计" & Number & "个" & vbCrLf
- End If
- Next
- Answer = Answer & String(45, "-") & vbCrLf & "统计结果总数为:" & Total & "个"
- FSO.OpenTextFile ("a.txt", 2, True).Write Answer
- Set FSO = Nothing
- CreateObject("Wscript.Shell").Run("a.txt")
复制代码
作者: batman 时间: 2011-7-2 14:10
唉,拿来主义到这里完全变成了伸手主义。。。
作者: wh1234567 时间: 2011-7-3 22:14
本帖最后由 wh1234567 于 2011-7-4 02:34 编辑
24# ArdentMan
有点看不懂,能不能解释一下如何使用?
作者: ArdentMan 时间: 2011-7-4 08:10
本帖最后由 ArdentMan 于 2011-7-4 08:26 编辑
26# wh1234567
偶的神,存为Jisuan.vbs再双击
作者: batman 时间: 2011-7-4 08:44
26# wh1234567
真让人蛋疼。。。
作者: wh1234567 时间: 2011-7-6 04:41
本帖最后由 wh1234567 于 2011-7-6 04:46 编辑
27# ArdentMan
很感谢您的二次修改,这下可以正常处理了,我在你第一次写好代码后保存为VBS后不能正常执行提示错误,所以问你如何使用,呵呵呵,不好意思啊,论坛有你们这些高手网友,相信论坛一定越办越火!
哎呀不对,小数值计算没问题,但遇到大数值计算就又出现错误了
脚本: D:\IP段计算.vbs
行: 11
字符: 6
错误: 下标越界: '[number: 0]'
代码: 800A0009
源: Microsoft VBScript 运行时错误
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |