Board logo

标题: [文本处理] [已解决]批处理如何提取文本中指定字符串(关键词)前面的特定行内容? [打印本页]

作者: jeesir    时间: 2016-3-21 13:32     标题: [已解决]批处理如何提取文本中指定字符串(关键词)前面的特定行内容?

小弟不是很懂所以来问问。
原LOG如下:
--------------------------------------------------------------------------------------------------------------
……

BTS ALARM HISTORY LISTING

    <HIST> BSC455    BCF-0440  BTS-0440    QUAL      2016-03-15  08:19:30.72
*** ALARM                         DESHENGHUABY1
                                  ENABLED
   (38348) 7767 BCCH MISSING


    <HIST> BSC455    BCF-0440  BTS-0441    QUAL      2016-03-15  08:19:30.92
*** ALARM                         DESHENGHUABY2
                                  ENABLED
   (38349) 7767 BCCH MISSING


    <HIST> BSC455    BCF-0440  BTS-0442    QUAL      2016-03-15  08:19:31.12
*** ALARM                         DESHENGHUABY3
                                  ENABLED
   (38350) 7767 BCCH MISSING

……

END OF BTS ALARM HISTORY LISTING

COMMAND EXECUTED

BTS ALARM HISTORY LISTING

    <HIST> BSC451    BCF-0373  BTS-0373    QUAL      2016-03-15  08:27:31.50
... CANCEL                        DONGYIGUOJISF
                                  DISABLED
   (36699) 7767 BCCH MISSING



END OF BTS ALARM HISTORY LISTING
……
--------------------------------------------------------------------------------------------------------------
我写的代码:
  1. @echo off
  2. for /f "tokens=1-4 delims=/-周 " %%i in ('date /t') do set Date=%%i-%%j-%%k
  3. (findstr/n "\<QUAL\>" "%Date%".log)>C:\Users\Administrator\Desktop\日志\"%Date%".txt
  4. exit
复制代码
提出来的txt是这样的
221:    <HIST> BSC455    BCF-0440  BTS-0440    QUAL      2016-03-15  08:19:30.72
227:    <HIST> BSC455    BCF-0440  BTS-0441    QUAL      2016-03-15  08:19:30.92
233:    <HIST> BSC455    BCF-0440  BTS-0442    QUAL      2016-03-15  08:19:31.12
674:    <HIST> BSC451    BCF-0373  BTS-0373    QUAL      2016-03-15  08:27:31.50
但我不想要字符为 CANCEL 的上一行数据。就是674这行的数据删除掉,怎么能实现?

我在论坛搜索了这个代码想把CANCEL 那一行删除掉再执行上面的代码,但是他把前面的数据也删除了。如下:
  1. @set @n=0;/* & echo off
  2. dir /b *.log|cscript -nologo -e:jscript "%~0" "%Input%"
  3. exit/b & rem */
  4. arg = WScript.Arguments(0);
  5. fso = new ActiveXObject("Scripting.FileSystemObject");
  6. while (!WSH.StdIn.AtEndOfStream) {
  7.     f = WSH.StdIn.ReadLine();
  8.     txt = fso.OpenTextFile(f,1).ReadAll();
  9.     txt = txt.replace(/QUAL[\s\S]*CANCEL/ig,"");
  10.     fso.OpenTextFile(f,2).Write(txt);
  11. }
复制代码
我只想实现这样的,帮帮忙啊:
221:    <HIST> BSC455    BCF-0440  BTS-0440    QUAL      2016-03-15  08:19:30.72
227:    <HIST> BSC455    BCF-0440  BTS-0441    QUAL      2016-03-15  08:19:30.92
233:    <HIST> BSC455    BCF-0440  BTS-0442    QUAL      2016-03-15  08:19:31.12
作者: codegay    时间: 2016-3-21 14:34

这种思路很SB.
优先的思路一般是想要的速数据是什么样模式,如何提取想要的数据.
作者: happy886rr    时间: 2016-3-21 14:44

回复 1# jeesir
  1. @echo off&setlocal enabledelayedexpansion
  2. set T=!date:~0,10!
  3. for /f "delims=" %%i in ('type !T:/^=-!.log') do (
  4. set "che=%%i"
  5. if /i not "!sel:QUAL=!"=="!sel!" (
  6. if /i "!che:CANCEL=!"=="!che!" (echo,!sel!)
  7. )
  8. set "sel=%%i"
  9. )
  10. pause
复制代码

作者: jeesir    时间: 2016-3-21 15:06

回复 3# happy886rr


    谢谢可以使用,请问怎么输出为txt文件?麻烦了
作者: WHY    时间: 2016-3-21 16:22

  1. @set @n=0;/* & echo off
  2. for /f "tokens=1-3delims=/-." %%i in ("%date:~0,10%") do set d=%%i-%%j-%%k
  3. cscript -nologo -e:jscript "%~0" < %d%.log | findstr "\<QUAL\>" > x.log
  4. pause & exit */
  5. WSH.Echo(WSH.StdIn.ReadAll().replace(/([\s\S]+)\bQUAL\b[\s\S]+?CANCEL[\s\S]*$/, '$1'))
复制代码





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