有没有办法在进程运行时编辑管道?

有没有办法在进程运行时编辑管道?

我有时会使用以下流程:

  • 启动缓慢
  • 跑一会儿
  • 将大量信息记录到标准输出

例如,假设这是一个大型 Web 应用程序。

现在假设,暂时我只想查看包含foo.我最终这样做:

$ heavy_process
# watch for a bit
# ah, now I just want to see lines that contain 'foo'
# (kill heavy_process)

$ heavy_process | grep foo
# watch for a bit
# ok, I'm statisfied about foo. Let's look at bar instead
# (kill heavy_process)

$ heavy_process | grep bar

heavy_process当我真的只想更改| grep.

有没有办法在命令行中的管道中“添加和删除管道”?

答案1

我想有些控制过程无法避免。我可以想到不同的方法。grep沿着 的核心的动态模式匹配器(而不是)awk '$0 ~ pat'pat动态加载(例如,通过 GNUawk协进程)。或者一些原始模式注入解决方案,其中改变模式指令被插入数据流中,以便awk过滤器可以轻松地动态调整模式,如下所示:

mkfifo cmdfifo       # create once an asynchroneous communication channel

{ while read cmd < cmdfifo ; do printf "%s\n" "@$cmd" ; done &
  heavy_process ;} |
    awk '
        /^@/ { pat = substr($0,2) ; next }   # parse the injected pattern
        pat !="" && $0 ~ pat     # if pattern is set print matching lines
    '

要激活或切换搜索特定模式,您可以使用,例如,

echo bar > cmdfifo

激活“bar”的匹配,以及随后的

echo foo > cmdfifo

将动态地将模式更改为“foo”。

答案2

我相信您自己的建议是最好的解决方案,修改为您在后台运行命令:

heavy_process > some_file &

添加2>&1ifheavy_process将您希望能够搜索的文本写入 stderr。既然你说程序“将大量信息记录到标准输出”,我建议不要使用2>&1.命令末尾&的 导致进程异步运行,这意味着您可以在终端运行时使用终端执行其他操作。根据您使用的 shell,您可能会在它终止时收到通知。

搜索流程的输出迄今为止, 所有你需要的是

grep foo some_file

搜索到目前为止的输出 并在进程写入文件时继续监视该文件, 使用

tail -n +1 -f some_file | grep foo

如果没有-n +1,tail将仅提供文件的最后 10 行。

答案3

您可以编写如下脚本:

#! /bin/bash
while true;
do
        echo -n "Enter your regexp: "
        read myregexp
        heavy_process | grep "$myregexp"
done

您可以随时使用 Ctrl-c 中断该过程

相关内容