[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理如何截取复杂文本WindowsUpdate.log中的指定内容?

WindowsXP的Windows目录下有个WindowsUpdate.log文件,有下载更新补丁的记录。我要查询它,产生两种结果:
一、截取KB补丁号
1、以KB开头,由6或7位数字跟随。例如:KB898030、KB2761226等等。
2、去除重复的补丁号,只保留不重复的。
二、截取exe文件的下载链接
以HTTP开头,以EXE结尾,中间有KB特征字符。例如:http://au.download.windowsupdate ... 09e8c2bf893ad7e.exe
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 10# jwwlchen


    管道,水管,把第一个findstr的结果输送给第二个findstr。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

回复 9# cjiabing


    你好 ,问个问题

'findstr /i "from to" WindowsUpdate.log^|findstr /i "exe psf"'

红色部分什么意思?? 看不懂。

TOP

本帖最后由 cjiabing 于 2012-11-18 09:27 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. cd.>tmp.txt
  3. for /f "tokens=2 delims=()" %%a in ('findstr /i  "KB" WindowsUpdate.log') do echo;%%a>>tmp.txt
  4. set num=0
  5. for /f "tokens=*" %%a in ('findstr /v /l /c:" " tmp.txt^|sort') do (
  6. if not defined %%a set %%a=A&set /a num+=1&echo [!num!].%%a
  7. )
  8. echo 共 !num! 个升级补丁。
  9. pause
  10. set num=0
  11. for /f "tokens=9" %%a in ('findstr /i "from to" WindowsUpdate.log^|findstr /i "exe psf"') do set /a num+=1&echo [!num!].%%a
  12. echo 共 !num! 个升级地址。
  13. pause
复制代码
数目对不上:34个补丁,57个地址?
KB应该没错了,我一个一个的对过。地址可能是因为有些失效,还有些是cab格式的没有搜索,有点累,不弄了。
1

评分人数

    • stance: 谢谢指导,计数法大开眼界。技术 + 1
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

回复 7# stance


   数了一下:如果删掉代码第13行和第15行(即不排除重复项),搜索到的全部KB补丁是586个,下载地址数是54个。

排除重复项后数目就对不上号,这个我不清楚。这方面你在行,看看是不是其他原因。。。

TOP

回复 5# apang

谢谢Apang!
试了一下VBS,输出KB补丁号40个,输出下载链接46个。
补丁号数不足,应该多于链接数,总数应过百.

TOP

本帖最后由 stance 于 2012-11-18 01:15 编辑

回复 4# tmplinshi
谢谢tmplinshi版主!

不过,我想用DOS自带工具来解决问题,不知行不?
SED从来没用过,一点也不熟悉.倒是很想学学.

TOP

vbs试试?
  1. Set FSO = CreateObject("Scripting.FileSystemObject")
  2. Text = FSO.OpenTextFile("WindowsUpdate.log",1).ReadAll
  3. CreateMyFile "kb[0-9]{6,7}","a.txt"
  4. CreateMyFile "http://.*?\.exe","b.txt"
  5. MsgBox "OK"
  6. Sub CreateMyFile(Pattern,File)
  7.    Set Re = New RegExp
  8.    Re.Pattern = Pattern
  9.    Re.Global = True
  10.    Re.IgnoreCase = True
  11.    For Each Match in Re.Execute(Text)
  12.       If InStr(LCase(Str), LCase(Match)) = 0 Then
  13.          Str = Str & Match & vbCrLf
  14.       End If
  15.    Next
  16.    FSO.CreateTextFile(File,True).Write Str
  17.    Str = ""
  18. End Sub
复制代码
1

评分人数

TOP

本帖最后由 tmplinshi 于 2012-11-18 01:13 编辑
  1. sed -n -r "s/KB[0-9]{6,7}/\n&\n/igp" WindowsUpdate.log | sed "/KB[0-9]\{6,7\}/!d" | sort | sed "$!N; /^\(.*\)\n\1$/!P; D" >KB.txt
复制代码
  1. sed -n "s|http://.*/.*kb.*\.exe|\n&\n|ip" WindowsUpdate.log | sed "/^http:\/\/.*\/.*kb.*\.exe$/!d" >urls.txt
复制代码
sed 下载地址: http://bathome.net/thread-15605-1-4.html
1

评分人数

    • stance: 谢谢指导,要学习SED。技术 + 1

TOP

回复 2# andyrave

谢谢关注。本来没装WINRAR,特地了装一下.

TOP

截取一段文本 50K文本里面内容已经很多了 上传上来 有些不用XP系统的人也可以看看 或许有些帮助
测试环境:WINDOWS 8 64Bit
如系统环境不同,请自行修改 :)

TOP

返回列表