テキストソート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:

エスケープコードを使用すると少し脆弱ですが、必要に応じて実行されます。

IMHOする必要がある正しいことは、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 後ろにserviceただし、ループ内でfor sをgrepする必要があります。それ以外の場合は、最初のサービスだけを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

ここでは、?フィールド区切り文字として使用できるように、および/の間に1つを印刷します。status:upDOWNcolumn

関連情報