标题: [其他] 如何输出两个ip之间所有ip [打印本页]
作者: 609496288 时间: 2018-4-26 17:06 标题: 如何输出两个ip之间所有ip
本帖最后由 pcl_test 于 2019-6-26 12:24 编辑
如何使用bat批量将ip段输出成一个个ip?
例如:
1.185.0.0 1.185.95.255
1.185.192.0 1.185.255.255
14.197.144.0 14.197.145.255
43.247.228.0 43.247.231.255
251.1.0.1 251.2.0.1
---------------------------------------------上面ip段整理后输出如下
1.185.0.0
1.185.0.1
.............
1.185.95.255
1.185.192.0
1.185.192.1
..............
1.185.255.255
14.197.144.0
14.197.144.1
..............
14.197.145.255
43.247.228.0
43.247.228.1
..............
43.247.231.255
251.1.0.1
251.1.0.2
..............
251.2.0.1
作者: 609496288 时间: 2018-4-26 20:17
这个输出很难么?
作者: codegay 时间: 2018-4-27 05:10
本帖最后由 codegay 于 2018-4-27 05:14 编辑
python3代码。思路是把ip地址转成一个10进制的自然数,然后range范围。再把数字转成IP地址。
IP地址转换成数字的部分参考了 https://blog.csdn.net/zhihaoma/article/details/51841169 等相关文章。- # -*- coding: utf-8 -*-
- """
- Created on Fri Apr 27 01:45:55 2018
- @author: codegay
- python3 & 编辑器 == spyder
- """
-
-
- # 把IP地址转换为一个自然数
- def IPToN(ipaddr, sep='.'):
- ip = [int(i) for i in ipaddr.split(sep)]
- result = ip[0]*256**3 + ip[1]*256**2 + ip[2]*256 + ip[3]
- return result
-
-
- # 把一个自然数转换成IP
- def NToIP(natural, sep='.'):
- ip = int(natural)
- result = [ip >> 24, (ip & 0x00FF0000) >> 16, (ip & 0x0000FF00) >> 8, ip & 0x000000FF]
- result = sep.join(map(str, result))
- return result
-
-
- def iprange(start, end, newline=''):
- result = [NToIP(n)+newline for n in range(IPToN(start), IPToN(end)+1)]
- return result
-
- print(IPToN("58.217.200.112"))
- print(IPToN("10.0.3.193"))
-
- print(NToIP(987351152))
-
- print(iprange("192.168.1.1", "192.168.1.255"))
-
- with open("ip.txt") as f:
- lines = [r.rstrip().split(" ") for r in f.readlines()]
- for line in lines:
- with open("result.txt", "w+") as rf:
- rf.writelines(iprange(line[0], line[1], newline='\r\n'))
复制代码
作者: zaqmlp 时间: 2018-4-27 07:41
255进制- @echo off&setlocal enabledelayedexpansion
- set ip1=251.1.0.1
- set ip2=251.2.0.1
- >"iplist.txt" (for /l %%a in () do (
- if not defined t (
- set t=%ip1%
- ) else (
- set s=
- for /f "tokens=1-4 delims=." %%b in ("!t!") do set s=%%e %%d %%c %%b
- set c=0
- set "ip="
- for %%b in (!s!) do (
- if not defined ip (
- if %%b equ 255 (
- set ip=0
- set c=1
- ) else (
- set /a d=%%b+1
- set ip=!d!
- )
- ) else (
- if !c! equ 1 (
- if %%b equ 255 (
- set ip=0.!ip!
- ) else (
- set /a e=%%b+c
- set ip=!e!.!ip!
- set c=0
- )
- ) else set ip=%%b.!ip!
- )
- )
- set t=!ip!
- )
- echo;!t!
- if not defined ip2 (
- if !t! equ 255.255.255.255 exit
- ) else (if !t! equ %ip2% exit)
- ))
复制代码
作者: /zhqsystem/zhq 时间: 2018-4-27 21:18
本帖最后由 /zhqsystem/zhq 于 2018-4-30 22:19 编辑
...不要把代码复杂化
直接数字填充就好了或是暴力0-255四个循环,如果过多建议用临时文件方式文件名称000.000.000.000,内容0.0.0.0
错误区域修正红色为遗漏字段
暴力法简单粗暴
for /f "delims=" %%i in ('type "1.txt"')do for %%n in (%%i)do (
set "#%%n=%%n"&&rem:变量方式判断适合较少的数据
(echo,%%n)>"%%n"&&rem:临时文件方式适合超多的数据
)
for /l %%i in (0,1,255)do for /l %%j in (0,1,255)do for /l %%k in (0,1,255)do for /l %%l in (0,1,255)do ( if defined #%%i.%%j.%%k.%%l echo,!#%%i.%%j.%%k.%%l!&&rem 变量方式判断适合较少的数据
if exist “%%i.%%j.%%k.%%l” type “%%i.%%j.%%k.%%l&&del/q “%%i.%%j.%%k.%%l"&&rem 临时文件方式适合超多的数据
)
作者: tigerpower 时间: 2018-4-27 22:44
使用perl,没有的在这里下载Perl。
只需其中的perl-mini.exe和perl518.dll两个文件,将perl-mini.exe改名为perl.exe
把楼主的那些一对对的IP保存为ip.txt,然后在命令行窗口运行以下命令:- perl -ne "($start,$end)=map eval,split;for($ip=$start;$ip le $end;$ip=pack q/N/,1+unpack q/N/,$ip){printf qq/%vd\n/,$ip}" ip.txt
复制代码
(注意:如果保存在.cmd/.bat中运行需要将%替换成%%)
作者: 609496288 时间: 2018-4-28 15:19
多谢各位的热心回答。感谢
回复 6# tigerpower
回复 5# /zhqsystem/zhq
回复 4# zaqmlp
回复 3# codegay
作者: 609496288 时间: 2018-4-29 10:57
回复 4# zaqmlp
这个批处理,怎么修改为读取txt然后再处理啊?
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |