【问题标题】:Findstr output formattingFindstr 输出格式
【发布时间】:2015-04-22 09:46:58
【问题描述】:

我有许多日志文件,我想从中提取特定文本并使用 FINDSTR 命令将其复制到新文件中,

例如:我有一个名为 1.log 的日志文件,我需要提取日志文件中所有以 N66666 行开头的数字,如下所示:

22220473400664->473400664
 01210260222->01210260222->N8888801210260222 
 01278448231->01278448231->N6666601278448231
 01286799109->01286799109->N8888801286799109

我试过了:

findstr /s /i "\<N66666.*" *.* > results.txt

但结果是以N6666 开头的整行复制到results.txt,我只需要将数字复制到results.txt。

【问题讨论】:

    标签: windows batch-file cmd findstr


    【解决方案1】:
    @ECHO OFF
    SETLOCAL
    SET "targetstring=N66666"
    FOR /f "tokens=3delims=>" %%a IN ('findstr /s /i "%targetstring%.*" *.*') DO ECHO(%%a
    
    GOTO :EOF
    

    这可能有用 - 您提供的信息非常少。

    它依赖于您所需的数据,即所需行中第二个&gt; 字符之后的字符串;我没有将结果重定向到文件,因为这是一个微不足道的修改。


    根据更多信息:

    @ECHO OFF
    SETLOCAL ENABLEDELAYEDEXPANSION
    SET "targetstring=N66666"
    SET /a ltargetstring=0
    SET "output=%targetstring%"
    :dtslp
    SET /a ltargetstring+=1
    SET "output=%output:~1%"
    IF DEFINED output GOTO dtslp
    FOR /f "delims=" %%a IN ('findstr /s /i "%targetstring%.*" *.*') DO (
     SET "line=%%a"
     SET "line=!line:>= !"
     SET "line=!line:<= !"
     SET "line=!line:"=!"
     CALL :process !line!
    )
    
    GOTO :EOF
    :process
    SET "output=%1"
    IF NOT DEFINED output GOTO :EOF 
    CALL SET "output=%%output:~0,%ltargetstring%%%"
    IF /i "%output%" neq "%targetstring%" GOTO miss
    SET "output=%1"
    CALL SET "output=%%output:~%ltargetstring%%%"
    ECHO(%output%
    
    :miss
    SHIFT
    GOTO process
    

    您提供的信息应该已经编辑到您的问题中,而不是作为 cmets 发布。

    您尚未回答原始解决方案依赖于“您所需的数据是所需行中第二个 > 字符之后的字符串中的数据”这一点,您已声明所需的输出“数字”是在“N66666”和下一个空格之间(或者,给定提供的数据,行尾;没有示例表明行上超出所需字符串的额外数据)

    所以还有很多猜测。

    此过程从文件中读取包含目标字符串的每一行,然后用空格替换 ech ">" 和 ""

    然后使用标准分隔符处理结果字符串,方法是使用子字符串方法将找到的每个子字符串与目标字符串匹配,该方法将初始化时计算的目标字符串的长度应用于ltargetstring

    如果找到的字符串的第一部分与目标匹配,则提取字符串的其余部分并echoed 并重复该过程,直到:process 没有更多参数为止。

    【讨论】:

    • 您好,感谢您的回复,我有一个包含许多日志文件的文件夹,我需要从所有这些日志文件中读取所有以 N66666 开头的数字并从中删除 N66666,然后重定向结果到一个输出文件,在上面的例子中,它应该得到N6666601278448231和前导N66666的切割并将结果作为01278448231放在输出文件中,如果切割前导N66666太复杂,可以将结果输出文件为 N6666601278448231 我可以稍后手动将其切断。
    • 在 N6666601278448231 之后可能还有文本,因此在提取所需文本时,我不需要提取到行尾,并且该数字的长度不固定,因此它应该开始从 N666666 中提取并停止第一个空格。
    猜你喜欢
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2017-03-25
    • 2018-04-17
    • 2011-12-06
    • 2021-02-12
    • 1970-01-01
    相关资源
    最近更新 更多