找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 29049|回复: 4

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

[复制链接]
发表于 2016-3-21 13:32:00 | 显示全部楼层 |阅读模式
小弟不是很懂所以来问问。
原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

评分

参与人数 1PB -2 收起 理由
pcl_test -2 未按版规发帖

查看全部评分

发表于 2016-3-21 14:34:36 | 显示全部楼层
这种思路很SB.
优先的思路一般是想要的速数据是什么样模式,如何提取想要的数据.
发表于 2016-3-21 14:44:29 | 显示全部楼层
回复 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技术 +1 收起 理由
jeesir + 1 乐于助人

查看全部评分

 楼主| 发表于 2016-3-21 15:06:20 | 显示全部楼层
回复 3# happy886rr


    谢谢可以使用,请问怎么输出为txt文件?麻烦了
发表于 2016-3-21 16:22:01 | 显示全部楼层
  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技术 +1 收起 理由
smss + 1 学习

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 22:38 , Processed in 0.020200 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表