如何执行 OR grep(使用不同的 GREP_COLOR 设置)

如何执行 OR grep(使用不同的 GREP_COLOR 设置)

因此,我想强调动态 motd 上服务的状态。我目前正在对 php-fpm 使用以下命令:

service php5-fpm status|grep Active|cut -d':' -f2-

我尝试了多种解决方案来实现这一目标。以下两个在检测 1/ 当一切正常时 2/ 所有其他情况方面做得很好。

service php5-fpm status|grep Active|cut -d':' -f2-|GREP_COLOR='1;32' grep --color=always " active \(.*\)"

service php5-fpm status|grep Active|cut -d':' -f2-|GREP_COLOR='1;31' grep --color=always -E ".* \(.*\)"

我试图做的是使用||将它们放在同一个命令中。当第一个 grep 返回 0 时,这工作正常,但是当它失败并返回 1 时,第二个 grep 似乎不起作用。

service php5-fpm status|grep Active|cut -d':' -f2-|(GREP_COLOR='1;32' grep --color=always -E " active \(.*\)" || GREP_COLOR='1;31' grep --color=always -E ".* \(.*\)")

当使用 bash -x 运行时,我得到以下输出:

+ GREP_COLOR='1;32'
+ grep --color=always -E ' active \(.*\)'
+ cut -d: -f2-
+ grep Active
+ service php5-fpm status
+ GREP_COLOR='1;31'
+ grep --color=always -E '.* \(.*\)'

所以......我现在不知道,我希望有人会看到我做错了什么。

答案1

Where will the 2nd grep get it's input from when the 1st grep fails?
Coz, grep1 consumes all the stdin with nothing left for grep2.In the
case of grep1 succeeding, grep2 never runs so is not an issue.

We may rig it up like the following to achieve what you want:

#/bin/sh
service php5-fpm status |
grep Active |
cut -d':' -f2- | tee /tmp/log |
GREP_COLOR='1;32' grep --color=always -E " active \(.*\)" - ||
GREP_COLOR='1;31' grep --color=always -E ".* \(.*\)") /tmp/log

答案2

好的,所以,这是我自己的解决方案,基于 Rakesh Sharma 对我的问题的评论,因为我不想创建临时文件。

function service_status() {
    status=`service $1 status | grep Active | cut -d':' -f2-`
    echo "$status" | GREP_COLOR='1;32' grep --color=always -E "^ active \(.*\)" || \
    echo "$status" | GREP_COLOR='1;31' grep --color=always -E ".* \(.*\)"
}

相关内容