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

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

小弟不是很懂所以来问问。
原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
1

评分人数

这种思路很SB.
优先的思路一般是想要的速数据是什么样模式,如何提取想要的数据.
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

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

评分人数

TOP

回复 3# happy886rr


    谢谢可以使用,请问怎么输出为txt文件?麻烦了

TOP

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

评分人数

TOP

返回列表