텍스트 정렬 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

여기서는 ?필드 구분 기호로 사용할 수 있도록 및 / 사이에 하나를 인쇄합니다.status:upDOWNcolumn

관련 정보