对齐文本 bash 脚本

对齐文本 bash 脚本

我正在编写一个脚本来检查许多应用程序服务。我的脚本在服务中循环。只是寻找对齐输出文本的最佳方法。

这是代码:

services=(
     'MonTier-AppAdmin'
     'MonTier-Derby'
     'MonTier-es-raw-trans-Nodes-1'
     'MonTier-es-raw-trans-Nodes-2'
     'MonTier-es-raw-trans-Nodes-3'
     'MonTier-es-raw-trans-Nodes-4'
     'MonTier-SyslogAgent-1'
     'MonTier-SyslogAgent-2'
     'MonTier-SyslogAgent-3'
     'MonTier-SyslogAgent-4'
     'MonTier-WsmAgent-1'
     'MonTier-WsmAgent-2'
     'MonTier-WsmAgent-3'
     'MonTier-WsmAgent-4'
     'MonTier-HK-ESRetention'
     'MonTier-HK-WdpDeviceResources'
     'MonTier-HK-WdpServiceResources'
     'MonTier-HK-SyslogKeepalive'
     'MonTier-HK-WsmKeepalive'
     'MonTier-UI'
     'MonTier-Reports'
     'MonTier-AgentNode'
     'Kibana'
)

servicestat=$(ps -ef | grep -v grep | grep "$services" | wc -l)
for s in ${services[*]}
        do
                if [ "$servicestat" = "1" ]; then
                printf "$s status: \033[0;92mup\e[0m \n"
        else
                printf "$s status: \033[0;31mDOWN\e[0m \n"
        fi
done

这是我收到的输出:

MonTier-AppAdmin status: up
MonTier-Derby status: up
MonTier-es-raw-trans-Nodes-1 status: up
MonTier-es-raw-trans-Nodes-2 status: up
MonTier-es-raw-trans-Nodes-3 status: up
MonTier-es-raw-trans-Nodes-4 status: up
MonTier-SyslogAgent-1 status: up
MonTier-SyslogAgent-2 status: up
MonTier-SyslogAgent-3 status: up
MonTier-SyslogAgent-4 status: up
MonTier-WsmAgent-1 status: up
MonTier-WsmAgent-2 status: up
MonTier-WsmAgent-3 status: up
MonTier-WsmAgent-4 status: up
MonTier-HK-ESRetention status: up
MonTier-HK-WdpDeviceResources status: up
MonTier-HK-WdpServiceResources status: up
MonTier-HK-SyslogKeepalive status: up
MonTier-HK-WsmKeepalive status: up
MonTier-UI status: up
MonTier-Reports status: up
MonTier-AgentNode status: up
Kibana status: up

我如何修改脚本以使输出如下所示?

MonTier-AppAdmin status:                   up
MonTier-Derby status:                      up
MonTier-es-raw-trans-Nodes-1 status:       up
MonTier-es-raw-trans-Nodes-2 status:       up
MonTier-es-raw-trans-Nodes-3 status:       up
MonTier-es-raw-trans-Nodes-4 status:       up
MonTier-SyslogAgent-1 status:              up
MonTier-SyslogAgent-2 status:              up
MonTier-SyslogAgent-3 status:              up
MonTier-SyslogAgent-4 status:              up
MonTier-WsmAgent-1 status:                 up
MonTier-WsmAgent-2 status:                 up
MonTier-WsmAgent-3 status:                 up
MonTier-WsmAgent-4 status:                 up
MonTier-HK-ESRetention status:             up
MonTier-HK-WdpDeviceResources status:      up
MonTier-HK-WdpServiceResources status:     up
MonTier-HK-SyslogKeepalive status:         up
MonTier-HK-WsmKeepalive status:            up
MonTier-UI status:                         up
MonTier-Reports status:                    up
MonTier-AgentNode status:                  up
Kibana status:                             up

答案1

如果您不需要将 保留:在最终输出中,那么

column -t -s:

会做你想做的事,尽管使用转义码它有点脆弱。

恕我直言,正确的做法是对 printf 使用宽度说明符。如果有一天任何服务的%名称中包含 ,这也可以阻止错误。

以 @jesse_b 关于 pgrep 的说法为基础,引用等,并在合理的情况下使用单引号

services=(
     'MonTier-AppAdmin'
     'MonTier-Derby'
     'MonTier-es-raw-trans-Nodes-1'
     'MonTier-es-raw-trans-Nodes-2'
     'MonTier-es-raw-trans-Nodes-3'
     'MonTier-es-raw-trans-Nodes-4'
     'MonTier-SyslogAgent-1'
     'MonTier-SyslogAgent-2'
     'MonTier-SyslogAgent-3'
     'MonTier-SyslogAgent-4'
     'MonTier-WsmAgent-1'
     'MonTier-WsmAgent-2'
     'MonTier-WsmAgent-3'
     'MonTier-WsmAgent-4'
     'MonTier-HK-ESRetention'
     'MonTier-HK-WdpDeviceResources'
     'MonTier-HK-WdpServiceResources'
     'MonTier-HK-SyslogKeepalive'
     'MonTier-HK-WsmKeepalive'
     'MonTier-UI'
     'MonTier-Reports'
     'MonTier-AgentNode'
     'Kibana'
)
for s in "${services[@]}"; do
    printf '%-42s ' "$s status:"
    if pgrep "$s"; then
        printf '\033[0;92mup\e[0m \n'
    else
        printf '\033[0;31mDOWN\e[0m \n'
    fi
done

这里我将宽度硬编码为 42,但如果服务数组发生变化,那么您可以循环该数组并计算最长的值。

答案2

您的脚本没有按照您想象的方式工作。

首先你应该使用pgrep而不是ps -ef,但如果你确实使用ps -ef你需要grep -v grep 你 grep for service.但是,您需要在循环内 grep for s,否则您只会 grep 一次第一个服务,而不会 grep 任何其他服务。

您还应该使用"${services[@]}"而不是${services[*]}

以下内容应该可以正常工作:

services=(
     'MonTier-AppAdmin'
     'MonTier-Derby'
     'MonTier-es-raw-trans-Nodes-1'
     'MonTier-es-raw-trans-Nodes-2'
     'MonTier-es-raw-trans-Nodes-3'
     'MonTier-es-raw-trans-Nodes-4'
     'MonTier-SyslogAgent-1'
     'MonTier-SyslogAgent-2'
     'MonTier-SyslogAgent-3'
     'MonTier-SyslogAgent-4'
     'MonTier-WsmAgent-1'
     'MonTier-WsmAgent-2'
     'MonTier-WsmAgent-3'
     'MonTier-WsmAgent-4'
     'MonTier-HK-ESRetention'
     'MonTier-HK-WdpDeviceResources'
     'MonTier-HK-WdpServiceResources'
     'MonTier-HK-SyslogKeepalive'
     'MonTier-HK-WsmKeepalive'
     'MonTier-UI'
     'MonTier-Reports'
     'MonTier-AgentNode'
     'Kibana'
)

for s in "${services[@]}"; do
    if pgrep -lf "$s" >/dev/null 2>&1; then
        printf '%s status:?%b\n' "$s" '\033[0;92mup\e[0m'
    else
        printf '%s status:?%b\n' "$s" '\033[0;31mDOWN\e[0m'
    fi
done | column -s? -t

这里我们在和/?之间打印一个,以便它可以用作字段分隔符status:upDOWNcolumn

相关内容