我有时会使用以下流程:
- 启动缓慢
- 跑一会儿
- 将大量信息记录到标准输出
例如,假设这是一个大型 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>&1
ifheavy_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 中断该过程