Board logo

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

作者: stance    时间: 2012-11-17 18:38     标题: [已解决]批处理如何截取复杂文本WindowsUpdate.log中的指定内容?

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

截取一段文本 50K文本里面内容已经很多了 上传上来 有些不用XP系统的人也可以看看 或许有些帮助
作者: stance    时间: 2012-11-17 22:47

回复 2# andyrave

谢谢关注。本来没装WINRAR,特地了装一下.
作者: tmplinshi    时间: 2012-11-17 23:55

本帖最后由 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
作者: apang    时间: 2012-11-18 00:48

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
复制代码

作者: stance    时间: 2012-11-18 00:51

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

回复 4# tmplinshi
谢谢tmplinshi版主!

不过,我想用DOS自带工具来解决问题,不知行不?
SED从来没用过,一点也不熟悉.倒是很想学学.
作者: stance    时间: 2012-11-18 01:13

回复 5# apang

谢谢Apang!
试了一下VBS,输出KB补丁号40个,输出下载链接46个。
补丁号数不足,应该多于链接数,总数应过百.
作者: apang    时间: 2012-11-18 02:59

回复 7# stance


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

排除重复项后数目就对不上号,这个我不清楚。这方面你在行,看看是不是其他原因。。。
作者: cjiabing    时间: 2012-11-18 08:46

本帖最后由 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格式的没有搜索,有点累,不弄了。
作者: jwwlchen    时间: 2012-11-18 22:05

回复 9# cjiabing


    你好 ,问个问题

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

红色部分什么意思?? 看不懂。
作者: cjiabing    时间: 2012-11-18 23:25

回复 10# jwwlchen


    管道,水管,把第一个findstr的结果输送给第二个findstr。




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