标题: [文本处理] BAT批处理如何读取txt中包含指定字符串的行? [打印本页]
作者: poi 时间: 2014-5-15 14:58 标题: BAT批处理如何读取txt中包含指定字符串的行?
需求
文本格式:
如:- 2014-05-13 00:00:00,003 INFO
- 2014-05-13 00:00:00,019 INFO
- sdsaldsdlfkjld
- 2014-05-13 00:01:25,145 ERROR
- 2014-05-13 00:03:00,037 INFO
- sdsaldsdlfkjld
- 2014-05-13 00:03:00,037 ERROR
- 2014-05-13 00:05:37,695 INFO
- 2014-05-13 00:10:10,339 INFO
- sdsaldsdlfkjld
- test
- 1
复制代码
需要显示的结果:- sdsaldsdlfkjld
- 2014-05-13 00:01:25,145 ERROR
- sdsaldsdlfkjld
- 2014-05-13 00:03:00,037 ERROR
- sdsaldsdlfkjld
- test
- 1
-
复制代码
需求:
1.每行以时间开始的并且还很ERROR字符 则输出到新文件
2.每行不是时间开始的直接输出到新文件
注意:非时间开始的行可能有特殊字符如:<a></a>
--------------------------------------------------------------------------------
我写了一个,单个运行可以一起就有问题- @echo off & setlocal EnableDelayedExpansion
-
- for /f "delims=""" %%i in (QQ.txt) do (
- set "str=%%i"
- echo !str! |findstr "^[0-9][0-9][0-9][0-9] ERROR ">>1.txt
- echo !str! |findstr /V "^[0-9][0-9][0-9][0-9]">>1.txt
- )
- 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
- @echo off
- setlocal EnableDelayedExpansion
- (for /f "delims=" %%i in (1.txt) do (
- set "str=%%i"
- echo !str! | findstr "^....-..-...*ERROR" > nul
- if !errorlevel! equ 0 (
- echo %%i
- ) else (
- echo !str! | findstr "^....-..-.." > nul
- if !errorlevel! neq 0 (
- echo %%i
- )
- )
- ))>2.txt
复制代码
作者: apang 时间: 2014-5-15 15:49
- @echo off
- findstr "^[1-9][0-9][0-9][0-9]-.*" 1.txt|findstr /iv "error">$
- findstr /ivxg:$ 1.txt>2.txt
- del $
- 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 - @echo off
- setlocal EnableDelayedExpansion
- (for /f "delims=" %%i in (1.txt) do (
- set "str=%%i"
- echo "!str!" | findstr "^.....-..-...*ERROR" > nul
- if !errorlevel! equ 0 (
- echo !str!
- ) else (
- echo "!str!" | findstr "^.....-..-.." > nul
- if !errorlevel! neq 0 (
- echo !str!
- )
- )
- ))>2.txt
复制代码
作者: DAIC 时间: 2014-5-15 16:08
不用发短消息给我,直接在我的回帖下面点击“回复”就行了。
作者: 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试试- 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
- @if(0)==(0) echo off
- CScript.exe //NoLogo //E:JScript "%~f0" <q.txt
- pause&goto:eof
- @end
- while (!WScript.StdIn.AtEndOfStream){
- var str = WScript.StdIn.Readline();
- f = str.match(/^(\d{4}-\d{2}-\d{2})\b/);
- if (f){
- f = str.match(/ERROR\s*$/);
- if (f) WScript.Echo(str);
- };
- else {WScript.Echo(str)};
- }
复制代码
作者: 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
我截取了下,但是这个效率很差,能优化不???- @echo off
- setlocal EnableDelayedExpansion
- (for /f "delims=" %%i in (1.txt) do (
- set "str=%%i"
- set "str=%%i"
- set "newStr=!str:~0,300!"
- echo "!newStr!" | findstr "^.....-..-...*ERROR" > nul
- if !errorlevel! equ 0 (
- echo !str!
- ) else (
- echo "!newStr!" | findstr "^.....-..-.." > nul
- if !errorlevel! neq 0 (
- echo !str!
- )
- )
- ))>100.txt
- 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
你用这个试试,你的这个好像把时间开始行取消掉了~- 2014-05-15 00:00:00,007 INFO [STDOUT] 00:00:00,007 FATAL adminManagerfile:51
- SSSSSS
- 2014-05-15 00:00:39,524 ERROR [STDOUT] 00:00:39,524 FATAL ExtractPerformanceDataServiceImpl:31
- 2014-05-15 00:03:14,480 INFO [STDOUT] 00:03:14,480 ERROR SocketClientUtils:97 - * BYE ?????í?ó???????ó????
- FFRSFGRG
- SDFSDF
复制代码
作者: terse 时间: 2014-5-16 13:30
回复 26# poi
代码第九行 换为下面的试- f = str.match(/\bERROR\b/);
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |