Bash의 동적 테이블에 대한 템플릿으로 출력 형식 지정

Bash의 동적 테이블에 대한 템플릿으로 출력 형식 지정

ps aux 명령을 사용하여 사용자 입력을 위한 프로세스에 정보를 제공하고 출력을 테이블 형식으로 표시하는 간단한 스크립트를 만들었습니다(mysql 셸에서 테이블 형식으로 수행하는 작업과 유사).

이것은 어느 정도 작동하지만 유일한 문제는 셀이 값의 길이에 따라 내용에 동적으로 적응하도록 만드는 방법입니다. 값이 너무 길면 테이블이 래핑되어 중단됩니다.

셀에 값을 래핑하는 더 스마트한 방법이 있나요?

#!/bin/bash
# Main function
    main() {
        read -p "Enter the name of the process: " process
        output=$(ps aux | awk -v process="$process" '$0 ~ process && !/awk/ {print}')
        
        if [ -n "$output" ]; then
            printf "+------------+------------+------------+------------+------------+----------------------------+\n"
            printf "| %-10s | %-10s | %-10s | %-10s | %-10s | %-100s |\n" "USER" "PID" "%CPU" "%MEM" "START" "COMMAND"
            printf "+------------+------------+------------+------------+------------+----------------------------+\n"
    
            echo "$output" | awk '{ printf "| %-10s | %-10s | %-10s | %-10s | %-10s | %-100s |\n", $1, $2, $3, $4, $9, substr($0, index($0,$11)) }'
    
            printf "+------------+------------+------------+------------+------------+----------------------------+\n"
        else
            echo "No such process found: $process"
        fi
    }
    # Call the main function
    main

위의 현재 출력:

Enter the name of the process: bash
+------------+------------+------------+------------+------------+----------------------------+
| USER       | PID        | %CPU       | %MEM       | START      | COMMAND                                                                                              |
+------------+------------+------------+------------+------------+----------------------------+
| userrt     | 1072       | 0.0        | 0.1        | 09:04      | -bash                                                                                                |
| userrt     | 1438       | 0.0        | 0.0        | 09:04      | bash                                                                                                 |
| userrt     | 1575       | 0.0        | 0.1        | 09:04      | /bin/bash --init-file /home/userrt/.vscode-server/bin/0ee08df0cf4527e40edc9aa28fdety5656bbff2b2/out/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh |
| userrt     | 3255       | 0.0        | 0.0        | 11:59      | /bin/bash ./process_monitoring.sh                                                                    |
| userrt     | 3286       | 0.0        | 0.0        | 11:59      | /bin/bash ./process_monitoring.sh                                                                    |
+------------+------------+------------+------------+------------+----------------------------+

작은 화면에서 원하는 출력은 다음과 같습니다.

Enter the name of the process: bash
+------------+------------+------------+------------+------------+-----------------------------------+
| USER       | PID        | %CPU       | %MEM       | START      | COMMAND                           |
+------------+------------+------------+------------+------------+-----------------------------------+
| userrt     | 1072       | 0.0        | 0.1        | 09:04      | -bash                             |
| userrt     | 1438       | 0.0        | 0.0        | 09:04      | bash                              |
| userrt     | 1575       | 0.0        | 0.1        | 09:04      | /bin/bash --init-file /home/      |
|            |            |            |            |            |  userrt/.vscode-server/bin/       |
|            |            |            |            |            |  0ee08df0cf4527e40edc9aa28fdety   |
|            |            |            |            |            |  5656bbff2b2/out/vs/workbench/    |
|            |            |            |            |            |  contrib/terminal/browser/media/  |
|            |            |            |            |            |  shellIntegrtion-bash.sh          |
| userrt     | 3255       | 0.0        | 0.0        | 11:59      | /bin/bash ./process_monitoring.sh |
| userrt     | 3286       | 0.0        | 0.0        | 11:59      | /bin/bash ./process_monitoring.sh |
+------------+------------+------------+------------+------------+-----------------------------------+

답변1

#!/bin/bash

main() {
    read -p "Enter the name of the process: " process
    output=$(ps aux | awk -v process="$process" '$0 ~ process && !/awk/ {print}')

    if [ -n "$output" ]; then
        # Print header
        printf "| %-10s | %-10s | %-10s | %-10s | %-10s | %-80s |\n" "USER" "PID" "%CPU" "%MEM" "START" "COMMAND"
        
        # Print separator
        printf "|%s|\n" "-------------------------------------------------------------------------------------------"
    
        # Print data, use column command for formatting
        echo "$output" | awk '{ printf "| %-10s | %-10s | %-10s | %-10s | %-10s | %-80s |\n", $1, $2, $3, $4, $9, substr($0, index($0,$11)) }' | column -t -s "|" | fold -w 80 -s
    else
        echo "No such process found: $process"
    fi
}

main

exit 0

출력이 전달되고 column열 너비가 자동으로 조정됩니다. -t테이블을 지정 하고 -s"|" 옵션으로 구분 기호를 설정합니다.

콘텐츠 길이에 따른 동적 테이블 레이아웃입니다.

관련 정보