3 개의 개별 열로 출력 인쇄


26
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)"

질문에 대한 세 가지 답변이 있으며,이 질문에 대한 답은 모두 귀하가 요구하는 사항을 해결합니다. 특정 답변을 얻고 자하는 것이 훨씬 정확해야합니다.
Bernhard

답변:


25

쉘 명령 'column'을 사용할 수 있습니다. columnMAN page 확인 하십시오 .

이것을 루프와 결합하면 다음과 같이 사업에 종사합니다.

#!/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

어떤 열에 무엇이 들어 갔는지에 대한 추가 제어가 필요했기 때문에 '*'에 열을 나누고 sed 's/^/ \* \*/g'물건을 첫 번째 열에서 세 번째 열로 옮기는 것과 같은 것을 사용했습니다 . 나를 위해 치료를했습니다.
LOAS

28

printf예를 들어을 사용하는 것이 좋습니다 .

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

여기서 %-30s 문자열 유형의 입력 인수에 30자를 예약합니다. -나타내고 정렬 왼쪽.


2

나는 루프와 함께 갈 것이다

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 

나는 당신에게 해결책이 아닌 방법을 주었다. 이제 FILENAME FILE과 TOPLINE이 루프 이전에 수행되는 대신 루프 내부에서 처리되도록 코드를 조정해야합니다.
BitsOfNix

모든 확장을 인용해야합니다. 그렇지 않으면 쉽게 중단됩니다.
Chris Down

2

이것이 유력한 것인지 확실하지 않은 경우, 유닉스에서 "붙여 넣기"를하면 파일을 열로 정렬 할 수 있습니다. sttdout을 다시 포맷하려면 printf가 필요할 수 있습니다. 예:

기둥


3
U & L에 오신 것을 환영합니다. 이미지로 텍스트를 게시하지 마십시오. 쉽게 복사 / 붙여 넣기 할 수 있습니다.
Archemar

1
동의합니다-복사하여 붙여 넣기 아직 투표를 할 수 없으므로 대신 의견을
보내주십시오

1

@qnimbus 답변은 Linux 시스템에 가장 적합하지만 Sun 또는 IBM (2019 년에 하나를 사용하기에 충분하지 않은 경우) 이 명령을 사용하지 못할 수 있습니다. 대신 pr명령 을 사용 하여 동일한 효과를 얻을 수 있습니다 . 링크 된 페이지의 예제에서 다음을 사용할 수 있습니다.

pr -3 word.lst | qprt

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.