テキストソート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にハードコードしていますが、サービス配列が変更されたら、配列を繰り返しながら最も長い値を計算できます。

おすすめ記事