代码之家  ›  专栏  ›  技术社区  ›  Michael

如何将文本文件输出重定向到管道中?

  •  2
  • Michael  · 技术社区  · 10 年前

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

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

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

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

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

    4 回复  |  直到 10 年前
        1
  •  2
  •   dimo414    10 年前

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

    例如,这应该起作用:

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

    这已经过去了 my_tool /dev/fd/XXX 它可以写入的路径。写入该路径的任何内容都通过管道传输 grep 然后写入 partial.log 文件

    从功能上讲,这与Kenster建议使用命名管道类似,但在我看来,流程替换通常更容易处理和推理。

        2
  •  2
  •   Kenster marc_s    10 年前

    您可以尝试使用 named pipe :

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

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

        3
  •  0
  •   Jokester    10 年前

    尝试 my_tool -l /dev/stdout | grep

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

        4
  •  0
  •   Jorge Torres    10 年前

    运行一个进程生成日志,另一个进程在创建日志并对其输出进行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 因此,它不会在打印自己的输出之前等待尾部完成。

    我希望这有帮助。