【问题标题】:How to filter txt file by string with using batch如何使用批处理按字符串过滤txt文件
【发布时间】:2010-05-26 12:36:28
【问题描述】:

我知道这种问题对你来说很容易,但我是批处理模式的初学者。

问题是 bat 文件代码应该如何从特定文件生成一个新的 txt 文件。

例如。

我有报告txt

Displaying status for license file: 7788@Server01

License Server: server01

                    License    In Use   Free
                    -------    ------   ----
                    Design*      1       6
                               (user1@host1)   127 server01 7788  4402

                  Assembly*      0       4

                       Pro       0      15

                     AdvSE       2       3
                              (user2@host2)  AdvSE server01 7788  2706
                              (user3@host3)  AdvSE server01 7788  1503

        SingleSite_License       1       3
                              (user4@host4)      SingleSite_License server01 7788  2003

      Intra_CLIENT_License        1       4
                              (user2@host2)      Intra_CLIENT_License server01 7788  2003

                       CAD       1      32
                              ^(user2@host2)     CAD server01 7788   501
* = License Extensions - Available only on startup.
^ = Borrowed License.
Press any key to continue . . . 

我想从这个新文件中得到的只有几行:

SingleSite_License 3

Intra_CLIENT_License 9

但是 SingleSite_License 和 Intra_Client_License 都应该取自第一个找到的字符串 - 其他不是必需的。

report txt 可以不同,许可证可以按不同顺序显示。

如果不可能 - 其他解决方案只能是 Free 值将写入新的 txt 文件 - f.e 3 和 9 。所以行中包含特定单词的最后一个字符串

感谢您的任何提示

【问题讨论】:

    标签: windows batch-file dos


    【解决方案1】:

    不确定您从哪里得到Intra_CLIENT_License9 数字(不应该是4 吗?),但此脚本将打印出这两个产品代码的免费许可证:

    @echo off
    setlocal enableextensions enabledelayedexpansion
    for /f "tokens=1,3" %%a in ('type infile.txt') do (
        if "x%%a"=="xSingleSite_License" (
            echo %%a %%b
        )
        if "x%%a"=="xIntra_CLIENT_License" (
            echo %%a %%b
        )
    )
    endlocal
    

    我基本上将您的成绩单剪切并粘贴到infile.txt 文件中并运行此脚本以获取:

    SingleSite_License 3
    Intra_CLIENT_License 4
    

    (您可以将type infile.txt 替换为生成该输出所需的任何命令)。


    细分:

    setlocal 只是设置了cmd.exe 以允许扩展和延迟扩展环境变量。我所有的脚本都以此开头,因为它非常有用。

    for 循环基本上一次处理一行,分别获取标记 1 和 3(ab)。

    然后只需检查a 以获得所需的许可证值,如果匹配,则将其与b 一起输出。

    【讨论】:

    • @Jens,是的,它是在 XP 上完成的,因此应该适用于所有受支持的 Windows 版本。不要试图将其向后移植到 Windows 3.11 :-) 自从 MSDOS 2.11 的脑死亡时代以来,Batch 已经走过了漫长的道路 - 它仍然无法与 UNIX shell 相匹敌,但它并没有糟糕。
    • HI 是的,你是对的 = 应该是 4 而不是 9 - 首先感谢您提供这个解决方案 - 它工作得很好。现在留给我的唯一问题是延迟执行此命令。因为首先脚本会创建 report.txt,然后在您编写时对其进行过滤。我不知道如何组合它们,因为过滤器搜索尚不存在的文件 - 它需要大约 3-5 秒,我不知道如何延迟它 - 我试过 "PING -n 4 127.0.0.1>nul " 但它不会暂停
    • @Ante,该 ping 命令应该等待 3 秒。去掉>nul 位,告诉我输出是什么。
    • 好吧,现在一切都好了。非常感谢您的提示!最好的问候
    【解决方案2】:

    编写一个 C 应用程序。批处理不必要地笨拙,甚至可能无法进行这种流操作。

    【讨论】:

    • HI 是的,你是对的 = 应该是 4 而不是 9 - 首先感谢您提供这个解决方案 - 它工作得很好。现在留给我的唯一问题是延迟执行此命令。因为首先脚本会创建 report.txt,然后在您编写时对其进行过滤。我不知道如何组合它们,因为过滤器搜索尚不存在的文件 - 它需要大约 3-5 秒,我不知道如何延迟它 - 我试过 "PING -n 4 127.0.0.1>nul " 但它不会暂停。
    【解决方案3】:

    下载 UnxUtils 并使用 Unix 流处理器。也可以使用 Powershell。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-25
      • 2018-05-13
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多