Board logo

标题: [文本处理] 批处理怎样批量统计所有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 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=1-8 delims=. " %%a in (a.txt) do (
  3.   set /a "a=(%%e-%%a)*(2<<23)+(%%f-%%b)*(2<<15)+(%%g-%%c)*(2<<7)+%%h-%%d+1,num+=a
  4.   echo %%a.%%b.%%c.%%d %%e.%%f.%%g.%%h 小计!a!个
  5. )
  6. echo 统计结果总数为:!num!个)>$
  7. 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

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (    for /f "tokens=1-8 delims=. " %%a in (a.txt) do (
  4.         set /a "sumrow=(%%e-%%a)*(2<<23)+(%%f-%%b)*(2<<15)+(%%g-%%c)*(2<<7)+%%h-%%d+1"
  5.         set /a sumtotal+=sumrow
  6.         echo %%a.%%b.%%c.%%d %%e.%%f.%%g.%%h 小计!sumrow!个
  7.     )
  8.     echo ------------------------------------------------
  9.     echo 统计结果总数为:!sumtotal!个
  10. )>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

借用超版的代码哈:
  1. @Echo Off&SetLocal EnableDelayedExpansion
  2. Set "Kg=                                               "
  3. (For /f "Tokens=1-8 Delims=. " %%a in (a.txt) do (
  4.   Set /a "a=(%%e-%%a)*(2<<23)+(%%f-%%b)*(2<<15)+(%%g-%%c)*(2<<7)+%%h-%%d+1,Num+=a
  5.   Set Str1=%%a.%%b.%%c.%%d%Kg%
  6.   Set Str2=%%e.%%f.%%g.%%h%Kg%
  7.   Echo !Str1:~,17!!Str2:~,17!小计!a!个                  
  8. )
  9. Echo -------------------------------------------------------------------------
  10. Echo 统计结果总数为:!Num!个)>$
  11. 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 编辑
  1. Dim FSO, Arr1, Str1, Arr2, Str2, Arr3, Number, Total, Answer
  2. Dim Num(2)
  3. Set FSO = CreateObject("Scripting.FileSystemObject")
  4. Arr1 = Split(FSO.OpenTextFile("a.txt").ReadAll(), vbCrLf)
  5. For Each Str1 In Arr1
  6.   If Str1 <> vbNullString Then
  7.    Arr2 = Split(Str1, Space(1)) : i = -1
  8.    For Each Str2 In Arr2
  9.      i = i + 1
  10.      Arr3 = Split(Str2, ".")
  11.      Num(i) = Arr3(0) * 256 * 256 * 256 + Arr3(1) * 256 * 256 + Arr3(2) * 256 + Arr3(3)
  12.      Answer = Answer & Str2 & vbTab
  13.    Next
  14.    Number = Num(1) - Num(0) + 1
  15.    Total = Total + Number
  16.    Answer = Answer & "小计" & Number & "个" & vbCrLf
  17.   End If
  18. Next
  19. Answer = Answer & String(45, "-") & vbCrLf & "统计结果总数为:" & Total & "个"
  20. FSO.OpenTextFile ("a.txt", 2, True).Write Answer
  21. Set FSO = Nothing
  22. 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