3개의 별도 열에 출력 인쇄

3개의 별도 열에 출력 인쇄
MYPATH=/var/www/html/error_logs/
TOTALFILE=$(ls $MYPATH* | wc -l)
FILETIME=$(stat --format=%y $MYPATH* | head -5 | cut -d'.' -f1)  
FILE=$(ls -1tcr $MYPATH* | head -5 | rev | cut -d/ -f1 | rev)
TOPLINE=$(head -1 $MYPATH* | grep -Po '".*?"' | head -5)

이 5개의 정보 파일을 헤더가 있는 열에 우아하게 인쇄하려면 어떻게 해야 합니까?

FILE CREATED TIME   | FILE NAME        | ERROR HEADER
---------------------------------------------
$FILETIME           | $FILE            | $TOPLINE
2012-11-29 11:27:45 | 684939947465     | "SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)"

그리고 5개 파일 모두에 대해서도 마찬가지입니다.

total files: $TOTALFILE

내가 원하는 것을 쉽게 얻을 수 있는 방법이 있나요?

각 변수를 에코할 때 얻는 결과는 다음과 같습니다.

2012-11-29 11:27:45 2012-11-29 11:27:41 2012-11-28 23:33:01 2012-11-26 10:23:37 2012-11-19 22:49:36
684939947465 1313307654813 1311411049509 1234980770182 354797376843
"SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)" "SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)" "Connection to localhost:6379 failed: Connection refused (111)" "An error occurred connecting to Redis." "SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)"

답변1

나는 사용하는 것이 좋습니다printf,예를 들어:

printf "%-30s | %-30s | %-30s" "$FILETIME" "$FILE" "$TOPLINE"

이는 %-30s 문자열 유형의 입력 매개변수에 30자가 예약되어 있음을 나타냅니다. 왼쪽 정렬을 나타냅니다 -.

답변2

column다음 명령을 사용할 수 있습니다리눅스의 일부입니다유틸리티Linux팩. 다음에서도 찾을 수 있습니다.FreeBSD,네트워크BSD,오픈BSD그리고잠자리BSD.

이것을 루프와 결합하면 작업 준비가 완료됩니다. 예를 들면 다음과 같습니다.

#!/bin/sh

MYPATH=/
TOTALFILE=$(ls $MYPATH/* | wc -l)
FILE=$(ls -1tcr $MYPATH/* | head -5 | rev | cut -d/ -f1 | rev)

declare -a FILES
declare -a FILETIME

OUTPUT="FILENAME CREATED TIME ERROR_HEADER\n\n------------------------------ ----------------------------- ----------------------------------- ------$"

for i in $MYPATH/*;
do
    FILES[${#FILES[@]}]="$i"
    FILETIME[${#FILETIME[@]}]=$(stat --format=%y $i | head -5 | cut -d'.' -f1)
    TOPLINE=$(head -1 $i | grep -Po '".*?"' | head -5)

    OUTPUT="$OUTPUT\n${FILES[${#FILES[@]}-1]} ${FILETIME[${#FILETIME[@]}-1]} $TOPLINE\n"
done

echo -ne $OUTPUT | column -t

답변3

나는 aa 루프를 선택하겠습니다

printf " %-20s | %-20s | %-20s\n " FILE\ CREATED\ TIME FILE\ NAME ERROR\ HEAD
for i in "$MYPATH"/*
do
    printf "%-20s | %-20s | %-20s\n " $FILENAME $FILE $TOPLINE
done
printf "Total Files: %s" $TOTALFILES 

답변4

@qnimbus 답변은 아마도 Linux 시스템에 가장 적합하지만 Sun 또는 IBM에서는 가능합니다.(2019년에 사용하지 않았거나 운이 좋았던 경우)이 명령을 사용하지 못할 수도 있습니다. 대신에 다음을 사용할 수 있습니다.pr주문하다같은 효과를 얻으려면. 링크된 페이지의 예에서 다음을 사용할 수 있습니다.

pr -3 word.lst | qprt

word.lst파일을 3개 열로 인쇄합니다. 즉, 이것은 문제에 대한 해결책의 일부일 뿐이며 나머지는 @qnimbus의 답변을 따르겠습니다.

관련 정보