如何在批处理文件中使用TYPE命令仅输出该行的一部分

时间:2015-03-10 18:54:21

标签: batch-file types findstr

我有一个批处理文件,只能输出日志文件中的几行。我使用的命令如下:

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行

1 个答案:

答案 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。 )