Board logo

标题: [文本处理] BAT批处理如何读取txt中包含指定字符串的行? [打印本页]

作者: poi    时间: 2014-5-15 14:58     标题: BAT批处理如何读取txt中包含指定字符串的行?

需求
文本格式:
如:
  1. 2014-05-13 00:00:00,003 INFO  
  2. 2014-05-13 00:00:00,019 INFO
  3. sdsaldsdlfkjld
  4. 2014-05-13 00:01:25,145 ERROR
  5. 2014-05-13 00:03:00,037 INFO
  6. sdsaldsdlfkjld
  7. 2014-05-13 00:03:00,037 ERROR  
  8. 2014-05-13 00:05:37,695 INFO  
  9. 2014-05-13 00:10:10,339 INFO
  10. sdsaldsdlfkjld
  11. test
  12. 1
复制代码
需要显示的结果:
  1. sdsaldsdlfkjld
  2. 2014-05-13 00:01:25,145 ERROR
  3. sdsaldsdlfkjld
  4. 2014-05-13 00:03:00,037 ERROR  
  5. sdsaldsdlfkjld
  6. test
  7. 1
复制代码
需求:
1.每行以时间开始的并且还很ERROR字符 则输出到新文件
2.每行不是时间开始的直接输出到新文件
注意:非时间开始的行可能有特殊字符如:<a></a>
--------------------------------------------------------------------------------
我写了一个,单个运行可以一起就有问题
  1. @echo off & setlocal EnableDelayedExpansion
  2. for /f "delims=""" %%i in (QQ.txt) do (
  3.    set "str=%%i"
  4.     echo !str!  |findstr "^[0-9][0-9][0-9][0-9] ERROR ">>1.txt
  5.     echo !str!  |findstr  /V  "^[0-9][0-9][0-9][0-9]">>1.txt
  6. )
  7. pause
复制代码

作者: poi    时间: 2014-5-15 15:18

坐等大神们回复·~~
作者: PowerShell    时间: 2014-5-15 15:33

开文件,遍历每一行,只要行 结尾含有info就丢弃,否则就输出到另外一个文件。 ----这样?
作者: poi    时间: 2014-5-15 15:33

[quote]坐等大神们回复·~~
作者: poi    时间: 2014-5-15 15:34

回复 3# PowerShell
还会有其他字符  不能按info处理
作者: DAIC    时间: 2014-5-15 15:45

  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. (for /f "delims=" %%i in (1.txt) do (
  4.     set "str=%%i"
  5.     echo !str! | findstr "^....-..-...*ERROR" > nul
  6.     if !errorlevel! equ 0 (
  7.         echo %%i
  8.     ) else (
  9.         echo !str! | findstr "^....-..-.." > nul
  10.         if !errorlevel! neq 0 (
  11.             echo %%i
  12.         )
  13.     )
  14. ))>2.txt
复制代码

作者: apang    时间: 2014-5-15 15:49

  1. @echo off
  2. findstr "^[1-9][0-9][0-9][0-9]-.*" 1.txt|findstr /iv "error">$
  3. findstr /ivxg:$ 1.txt>2.txt
  4. del $
  5. pause
复制代码

作者: poi    时间: 2014-5-15 15:54

回复 6# DAIC

按上面代码可以,但上面说了txt里可能含有<a>0215138009</a>

所以运行bat会有三种错误
1.此时不应有 <。
2.命令语法不正确。
3.系统找不到指定的文件。

----怎么让他忽略txt里的特殊字符????
作者: DAIC    时间: 2014-5-15 15:58

回复 8# poi
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. (for /f "delims=" %%i in (1.txt) do (
  4.     set "str=%%i"
  5.     echo "!str!" | findstr "^.....-..-...*ERROR" > nul
  6.     if !errorlevel! equ 0 (
  7.         echo !str!
  8.     ) else (
  9.         echo "!str!" | findstr "^.....-..-.." > nul
  10.         if !errorlevel! neq 0 (
  11.             echo !str!
  12.         )
  13.     )
  14. ))>2.txt
复制代码

作者: DAIC    时间: 2014-5-15 16:08

你好,刚那个bat还有点小问题,能看下嘛?

不用发短消息给我,直接在我的回帖下面点击“回复”就行了。
作者: poi    时间: 2014-5-15 16:18

回复 10# DAIC
嗯  谢谢~
没问题了,还有就是问下bat处理txt一般能处理多大·~,几十M应该没问题·~
我刚试了下10m 运行了好久  等会我算下时间
作者: sajiawuwu    时间: 2014-5-15 16:34

@echo off
for /f "tokens=1-3" %%a in (QQ.txt) do (
    if not "%%c"=="INFO" (echo %%a %%b %%c>>2.txt)
)
作者: DAIC    时间: 2014-5-15 16:40

回复 11# poi


用gawk.exe试试
  1. gawk "{if($0~/....-..-...*ERROR/)print;else if($0!~/....-..-../)print}" 1.txt > 2.txt
复制代码

作者: poi    时间: 2014-5-15 16:53

回复 10# DAIC
有的行太长报错怎么办?
报:findstr:行1太长。
作者: poi    时间: 2014-5-15 17:07

本帖最后由 poi 于 2014-5-15 17:09 编辑

还有我的文本一般在10-30m
有的行可能也很多~~
有什么好的方法没(效率能提高的)???

我们现在使用html 用js提取这些信息,也要分割文件~~
如果bat也要分割就没多大意义了·~
作者: zhao3    时间: 2014-5-15 17:19

软件名称:超级批量文本替换(BatchTextReplace)
这个软件可以满足你的要求,其实你要的就是去掉:2014-05-13 00:00:00,003 INFO 这样的信息。
你可以在替换中选择"特征替换",开始标志“2014-”,结束标志“ INFO”
就会将这些正常信息全部去掉,剩下的就是有提示的错误信息。。。。
作者: DAIC    时间: 2014-5-15 17:24

回复 15# poi


    请看13楼
作者: terse    时间: 2014-5-15 21:53

  1. @if(0)==(0) echo off
  2. CScript.exe //NoLogo //E:JScript "%~f0" <q.txt
  3. pause&goto:eof
  4. @end
  5. while (!WScript.StdIn.AtEndOfStream){
  6.     var str = WScript.StdIn.Readline();
  7.     f = str.match(/^(\d{4}-\d{2}-\d{2})\b/);
  8.     if (f){
  9.        f = str.match(/ERROR\s*$/);
  10.        if (f) WScript.Echo(str);
  11.     };
  12.     else {WScript.Echo(str)};
  13. }
复制代码

作者: poi    时间: 2014-5-15 22:21

回复 18# terse


什么啊 直接看不懂~~
作者: terse    时间: 2014-5-15 22:28

回复 19# poi
这个 处理文件名为 Q.txt 的文件 如有变动 请自行修改 第二行行尾的 <q.txt
作者: poi    时间: 2014-5-15 23:04

我截取了下,但是这个效率很差,能优化不???
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. (for /f "delims=" %%i in (1.txt) do (
  4.     set "str=%%i"
  5.      set "str=%%i"
  6.     set "newStr=!str:~0,300!"
  7.     echo "!newStr!" | findstr "^.....-..-...*ERROR" > nul
  8.     if !errorlevel! equ 0 (
  9.         echo !str!
  10.     ) else (
  11.         echo "!newStr!" | findstr "^.....-..-.." > nul
  12.         if !errorlevel! neq 0 (
  13.             echo !str!
  14.         )
  15.     )
  16. ))>100.txt
  17. pause
复制代码

作者: poi    时间: 2014-5-15 23:04

回复 20# terse


    你这个怎么运行啊~~
作者: terse    时间: 2014-5-15 23:10

回复 22# poi
保存为BAT文件 和处理文件同一目录
作者: poi    时间: 2014-5-16 09:54

回复 23# terse


    你这个没有实现!!有点问题~~
作者: terse    时间: 2014-5-16 12:01

仅用一楼数据测试
作者: poi    时间: 2014-5-16 13:07

回复 25# terse
你用这个试试,你的这个好像把时间开始行取消掉了~
  1. 2014-05-15 00:00:00,007 INFO  [STDOUT] 00:00:00,007 FATAL adminManagerfile:51
  2. SSSSSS
  3. 2014-05-15 00:00:39,524 ERROR  [STDOUT] 00:00:39,524 FATAL ExtractPerformanceDataServiceImpl:31
  4. 2014-05-15 00:03:14,480 INFO  [STDOUT] 00:03:14,480 ERROR SocketClientUtils:97 - * BYE ?????í?ó???????ó????
  5. FFRSFGRG
  6. SDFSDF
复制代码

作者: terse    时间: 2014-5-16 13:30

回复 26# poi

代码第九行 换为下面的试
  1. f = str.match(/\bERROR\b/);
复制代码





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