【问题标题】:How can I test whether stdout matches a pattern, but still print it?如何测试标准输出是否与模式匹配,但仍然打印它?
【发布时间】:2018-04-20 19:26:30
【问题描述】:

我想做一些类似正在运行的进程的日志分析器。假设我运行一个服务器,stdout 通过管道传递到 bash 脚本,IF 语句在哪里。如果输出中出现字符串“somethings”,则脚本会终止服务器。如果不是,那么它通常会打印 stdout 并且仍在运行。

例子:

./server | if.bash

if.bash 的内容:

if grep 'somethings'; then
     kill app
else
     echo server output
fi

以上代码成功运行测试,但不打印原始标准输出。如何确保内容仍然打印?

【问题讨论】:

  • “杀死服务器”是什么意思?如果您的意思是 bash 脚本关闭其管道末端,以便服务器在写入数据时获得 SIGPIPE,那么您想要的相对容易。如果您希望脚本对进程组进行一些自省并找出服务器的 pid 并向其发送信号,那将更加困难。

标签: bash pipe


【解决方案1】:

循环读取输出:

while read -r line; do
    if [[ $line =~ something ]];
    then
        kill app
        break
    else
        printf "%s\n" "$line"
    fi
done

另一个选项是在运行脚本时使用tee

./server | tee /dev/tty | if.bash

tee 会在终端上输出消息并发送到管道。

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 1970-01-01
    • 2017-07-02
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 2021-09-10
    相关资源
    最近更新 更多