我有一个批处理文件,只能输出日志文件中的几行。我使用的命令如下:
TYPE "file.log" | FINDSTR /C:"CPU usage:" /C:"RAM:" | FINDSTR /v /c:"Total: 0 B/s" >> "temp.log"
我试图加快此命令并减小输出文件的大小。为了实现这一点,我想只输出一部分线。典型的行看起来像:
2 2015-01-20 18:07:16.808 INFO somelongtext1 text2 shorttext3 Physical RAM: Total=8000 MB
3 2015-01-20 18:07:16.886 INFO text5 shorttext2 text6 Total CPU usage: 42.87%
有没有办法输出没有text1,text2,textX ....?
的行第二个FINDSTR确保我没有输出具有值" 0"
的行。列没有固定长度,但我想要搭乘的文字几乎总是相同(3-4个不同的单词)。
我的文件大约有100000行,我只会输出大约10000行
答案 0 :(得分:0)
嗯,首先,你对TYPE
毫无用处。 findstr
能够读取文本文件。摆脱TYPE
可以使你的命令更有效率。您还可以通过将findstr /v
替换为内部子字符串替换来获得一些效率。
@echo off
setlocal enabledelayedexpansion
>"temp.log" (
(
for /f "tokens=1-4,7*" %%I in (
'findstr /c:"CPU usage:" /c:"RAM:" "file.log"'
) do (
set "line=%%I %%J %%K %%L %%N"
if "!line!"=="!line: 0 B/s=!" (
echo(!line!
)
)
)
)
它的代码更多,但内部命令通常比可执行文件更快。但是,如果您正在解析大文件,则初始findstr
将有所帮助。文本流处理器比for
循环更快。
看起来您正在抓取的日志总是需要删除第5,6和7列。如果是这种情况,您只需在tokens
循环中包含for /f
参数,并保留第1列到第4列,然后是第7列之后的所有内容。(在上面的代码中有意删除%%M
。 )