wydrukować wyniki do 3 oddzielnych kolumn

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)

jak mogę elegancko wydrukować tę informację o 5 plikach w kolumnach z nagłówkami?

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

i tak dalej 5 plików

total files: $TOTALFILE

czy jest jakiś prosty sposób na zdobycie tego, czego chcę?

Uwaga: to wyjście mam, gdy echo każdej zmiennej

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)"
ADM
źródło
Otrzymałeś trzy odpowiedzi na swoje pytanie, z których wszystkie dotyczą pytań. Powinieneś być bardziej precyzyjny w tym, co chcesz uzyskać konkretną odpowiedź.
Bernhard

Odpowiedzi:

25

Możesz w tym celu użyć polecenia powłoki „kolumna”, sprawdź: columnstrona MAN .

Połącz to z pętlą i jesteś w biznesie, np .:

#!/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
QNimbus
źródło
Potrzebowałem dalszej kontroli tego, co poszło w której kolumnie, więc podzieliłem kolumny na „*” i użyłem czegoś w rodzaju sed 's/^/ \* \*/g'do przenoszenia rzeczy z pierwszej kolumny na trzecią. Pracowała dla mnie uczta.
LOAS
28

Poleciłbym użyć printfnp .:

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

Gdzie %-30s oznacza zarezerwowanie 30 znaków dla argumentu wejściowego typu string. W -oznacza lewy wyrównania.

Bernhard
źródło
2

Poszedłbym z pętlą

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 
BitsOfNix
źródło
Dałem ci jak nie rozwiązanie. Teraz musisz dostosować swój kod, tak aby PLIK NAZWA PLIKU i TOPLINE były obsługiwane wewnątrz pętli zamiast robić to przed pętlą.
BitsOfNix,
Musisz podać wszystkie swoje rozszerzenia, w przeciwnym razie łatwo się zepsuje.
Chris Down
2

Nie jestem pewien, czy to jest to, co zamierzasz, „wklej” w Uniksie może uporządkować pliki w kolumnie, może być konieczne printf, aby sformatować sttdout. przykład:

kolumna

Oni Huyen
źródło
3
witamy w U&L, nie wysyłaj tekstu jako obrazu, możesz łatwo kopiować / wklejać.
Archemar
1
Zgadzam się - skopiuj i wklej. Nie mogę jeszcze głosować, więc skomentuj
KolonUK
1

Odpowiedź @qnimbus jest prawdopodobnie najlepsza dla systemów Linux, ale w Sun lub IBM (jeśli nie masz szczęścia, by użyć jednego w 2019 r.) ta komenda może być niedostępna. Zamiast tego możesz użyć prpolecenia, aby uzyskać ten sam efekt. Z przykładów na połączonej stronie możesz użyć następujących opcji:

pr -3 word.lst | qprt

aby wydrukować plik word.lstw 3 kolumnach. To powiedziawszy, to tylko część rozwiązania twojego problemu, a resztę odkładam na odpowiedź @qnimbus.

nonsensickle
źródło