Board logo

标题: [文本处理] 求助:BAT提取文本里的ip地址 [打印本页]

作者: wang6542975    时间: 2013-9-27 13:49     标题: 求助:BAT提取文本里的ip地址

本帖最后由 wang6542975 于 2013-9-27 14:40 编辑

1.txt里的内容为
123.52.99.58的分组为:网维
1.1.1.1的分组为:网维
3.3.3.3分组为XX
4.35.20.4
怎么提取里面的IP地址到2.txt里


我写的代码如下:
  1. for /f "delims=. tokens=1,2,3," %%a in (1.txt) do echo %%a.%%b.%%c.%%d>>2.txt
复制代码
。。有问题。。怎么修改。谢谢大家。
作者: batman    时间: 2013-9-27 14:17

本帖最后由 batman 于 2013-9-27 14:37 编辑

如果文本每行全是123.52.99.58的分组为:网维这样的格式:
  1. @echo off
  2. (for /f "delims=的" %%a in (1.txt) do echo,%%a)>2.txt
  3. start 2.txt
复制代码
如果不是每行都是一样的格式:
  1. @echo off
  2. (for /f "delims=的" %%a in ('findstr "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" 1.txt') do echo,%%a)>2.txt
  3. start 2.txt
复制代码

作者: wang6542975    时间: 2013-9-27 14:23

哥哥,第二个代码貌似有问题。
作者: batman    时间: 2013-9-27 14:24

for /f 有几个参数eol usebackq skip tokens delims,建议使用以下顺序来书写:
for /f "eol=a usebackq skip=1 tokens=1-4 delims=. " %%a in ("a b.txt") do...
如上for将会在读取a b.txt时忽略以a字符打头的行,并跳过头行,而取每行中以.和空格为分隔符分隔的1-4列的字符串。
作者: wang6542975    时间: 2013-9-27 14:27

谢谢BATMAN。但是你第二个代码没成功。。
作者: wang6542975    时间: 2013-9-27 14:29

IP最后一位后面没分隔符
作者: DAIC    时间: 2013-9-27 14:29

  1. sed "s/的.*//" a.txt > b.txt
复制代码

作者: wang6542975    时间: 2013-9-27 14:32

。。。不用第三方就实现不 了吗
作者: batman    时间: 2013-9-27 14:34

回复 3# wang6542975


    是因为findstr中的转义符\写成了/,已改正
作者: wang6542975    时间: 2013-9-27 14:36

哥哥们。IP最后一位后面是没分隔符的。。看清楚。
作者: batman    时间: 2013-9-27 14:38

回复 10# wang6542975


    你再看2楼的代码。。。
作者: DAIC    时间: 2013-9-27 14:39

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1-4 delims=." %%a in (a.txt) do (
  4.     set ipend=%%d
  5.     if "!ipend:~2,1!" leq "9" (
  6.         set ipend=!ipend:~0,3!
  7.     ) else if "!ipend:~1,1!" leq "9" (
  8.         set ipend=!ipend:~0,2!
  9.     ) else if "!ipend:~0,1!" leq "9" (
  10.         set ipend=!ipend:~0,1!
  11.     )
  12.     echo %%a.%%b.%%c.!ipend!
  13. ))>b.txt
复制代码

作者: wang6542975    时间: 2013-9-27 14:40

再看我1.txt里的内容。
作者: DAIC    时间: 2013-9-27 14:41

回复 10# wang6542975


我这里测试2楼的第二个代码没有发现问题

d:\Test>type a.txt
123.52.99.58的分组为:网维
1.1.1.1的分组为:网维
123.52.99.159的分组为:网维

d:\Test>test.bat
123.52.99.58
1.1.1.1
123.52.99.159
作者: wang6542975    时间: 2013-9-27 14:42

本帖最后由 wang6542975 于 2013-9-27 14:43 编辑

再看我1.txt里的内容。DAIC 哥做的完美。
作者: wang6542975    时间: 2013-9-27 14:49

难度再提升一下!如果1.txt的内容如下:
123.52.99.58的分组为:网维
1.2.2.3.sdaf
20.1.13.5
127.0.0.1
分组为:网维5.6.3.44

如何提取IP地址?
作者: batman    时间: 2013-9-27 14:53

本帖最后由 batman 于 2013-9-27 14:56 编辑

回复 15# wang6542975


    你要求总在改?我给一个极端文本吧

25.12.167.7检2组
1234.34.87.19
103.256.78.11
57.83.022.44
78.71.74.296国家地址
192.168.0.23在线
处理后应是
25.12.167.7
192.168.0.23
作者: wang6542975    时间: 2013-9-27 14:54

恩。。。BATMAN哥。我的要求总在变。
作者: batman    时间: 2013-9-27 14:57

回复 18# wang6542975


    这是不尊重人的表现,没有哪个代码可以处理所有情况,具体问题具体分析才是的。。。
作者: wang6542975    时间: 2013-9-27 14:58

奥。奥。这是我没考虑到的。不好意思。
作者: DAIC    时间: 2013-9-27 16:02

本帖最后由 DAIC 于 2013-9-27 16:04 编辑

回复 16# wang6542975
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (for /f "tokens=1-4 delims=." %%a in (a.txt) do (
  4.     if "%%a" leq "9" (
  5.         set ipend=%%d
  6.         if "!ipend:~2,1!" leq "9" (
  7.             set ipend=!ipend:~0,3!
  8.         ) else if "!ipend:~1,1!" leq "9" (
  9.             set ipend=!ipend:~0,2!
  10.         ) else if "!ipend:~0,1!" leq "9" (
  11.             set ipend=!ipend:~0,1!
  12.         )
  13.         set ip=%%a.%%b.%%c.!ipend!
  14.     ) else (
  15.         set ipstart=%%a
  16.         if "!ipstart:~-3,1!" leq "9" (
  17.             set ipstart=!ipstart:~-3,3!
  18.         ) else if "!ipstart:~-2,1!" leq "9" (
  19.             set ipstart=!ipstart:~-2,2!
  20.         ) else if "!ipstart:~-1,1!" leq "9" (
  21.             set ipstart=!ipstart:~-1,1!
  22.         )
  23.         set ip=!ipstart!.%%b.%%c.%%d
  24.     )
  25.     echo !ip!
  26. ))>b.txt
复制代码

作者: terse    时间: 2013-9-27 16:29

三方SED
  1. @echo off
  2. sed -r "s/[^0-9]*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*/\1/" 1.txt
  3. pause
复制代码
P的话不一定很精准
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1-4 delims=." %%a in (1.txt) do (
  3.     set ipa=&set "ipd="
  4.     set a=%%a&set d=%%d
  5.     for /L %%i in (1,1,3) do (
  6.          if "!a:~-%%i,1!" leq "9" if "!a:~-%%i,1!" geq "0" set ipa=!a:~-%%i,1!!ipa!
  7.     )
  8.     for /L %%i in (0,1,2) do (
  9.          if "!d:~%%i,1!" leq "9" if "!d:~%%i,1!" geq "0" set ipd=!ipd!!d:~%%i,1!
  10.     )
  11.     echo !ipa!.%%b.%%c.!ipd!
  12. )
  13. pause
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2