【问题标题】:How to redirect a text file output into a pipe?如何将文本文件输出重定向到管道中?
【发布时间】:2016-02-09 01:35:57
【问题描述】:

我正在运行一个带有选项-l log_file 的Unix 工具。我想将其重定向到管道中,如下所示:

my_tool -l /dev/tty | grep "Aye, Caramba!"

不幸的是,当我指定/dev/tty 时,my_tool 的输出直接进入控制台窗口,绕过了grep

我也试过/dev/stdout,但无济于事。

因此问题是:我需要为上面的选项-l 指定什么才能将相应的输出捕获到管道中?

【问题讨论】:

  • 如果你在没有管道的情况下执行my_tool -l /dev/stdout 会发生什么?它是否记录到标准输出?如果没有,my_tool 会发生其他事情。

标签: linux shell unix pipe


【解决方案1】:

您可以使用process substitution 创建文件句柄,通过命令管道将写入句柄的任何内容通过管道传输。

例如,这应该可以工作:

my_tool -l >(grep "Aye, Caramba!" > path/to/store/partial.log)

这将传递my_tool 一个它可以写入的/dev/fd/XXX 路径。写入该路径的任何内容都通过grep 传输,然后写入partial.log 文件。

在功能上这类似于 Kenster 使用命名管道的建议,但在我看来,进程替换通常更易于使用和推理。

【讨论】:

    【解决方案2】:

    您可以尝试使用named pipe:

    mkfifo pipe
    grep "Aye, Caramba!" pipe &
    my_tool -l pipe
    

    在本例中,grep 将打开pipe 进行读取,这将阻塞直到另一个进程打开它进行写入。当 my_tool 将数据写入管道时,grep 将能够读取数据。一旦 my_tool 关闭 pipe,grep 将获得文件结束指示并退出。

    【讨论】:

      【解决方案3】:

      试试my_tool -l /dev/stdout | grep

      正如 Zach 所建议的,命令本身可能支持其他选项。

      【讨论】:

        【解决方案4】:

        运行一个生成日志的进程,然后在创建日志后运行另一个进程并 grepping 其输出可能很有用

        为此,您可以在一个控制台中运行 my_tool,生成所需的日志。

        my_tool -l /tmp/mylog
        

        然后您可以在不同的控制台中运行:

        tail -f -n+0 /tmp/mylog | grep --line-buffered the_pattern_to_match
        

        tail 将打印作为参数传递的文件的“最后”行。 -n+0 告诉 tail 将整个文件处理到它被写入的位置。 -f 告诉 tail 保持文件打开并继续将到达的任何内容发送到标准输出(在这种情况下重定向到管道)。

        然后在 grep 中,您将需要 --line-buffered,因此它不会等待 tail 完成就打印自己的输出。

        我希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 2013-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-21
          • 2019-02-08
          • 2023-03-18
          • 2017-08-11
          • 1970-01-01
          相关资源
          最近更新 更多