stampa l'output su 3 colonne separate


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)

come posso stampare elegantemente queste informazioni su 5 file in colonne con intestazioni?

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

e così via 5 file

total files: $TOTALFILE

c'è un modo semplice per ottenere quello che voglio?

nota: questo risultato ho ottenuto quando echeggiano ogni variabile

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

Hai tre risposte alla tua domanda, che riguardano tutte le cose che chiedi. Dovresti essere molto più preciso in ciò che vuoi ottenere una risposta specifica.
Bernhard,

Risposte:


25

Puoi usare il comando shell 'colonna' per questo, controlla: columnMAN page .

Combina questo con un ciclo e sei in affari, ad esempio:

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

Avevo bisogno di un ulteriore controllo di ciò che andava in quale colonna, quindi ho diviso le colonne su '*' e usato qualcosa di simile sed 's/^/ \* \*/g'per spostare le cose dalla prima colonna alla terza. Ha funzionato a meraviglia per me.
LOAS

28

Consiglio di utilizzare printf, ad esempio:

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

Dove %-30s significa riservare 30 caratteri per l'argomento di input di tipo stringa. I -denota sinistra allineamento.


2

Vorrei andare con un ciclo

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 

Ti ho dato come non la soluzione. Ora devi adattare il tuo codice in modo tale che FILENAME FILE e TOPLINE siano curati all'interno del loop invece di farlo prima del loop.
BitsOfNix il

Devi citare tutte le tue espansioni, altrimenti si romperà facilmente.
Chris Down,

2

Non sono sicuro se questo è ciò che stai facendo, "incolla" in unix può disporre i file in colonna, potrebbe essere necessario printf per riformattare lo sttdout. esempio:

colonna


3
benvenuto a U&L, per favore non pubblicare testo come immagine, puoi copiare / incollare facilmente.
Archemar,

1
Sono d'accordo - copia e incolla. Non posso ancora votare in basso, quindi commenta invece
KolonUK,

1

La risposta di @qnimbus è probabilmente la migliore per i sistemi Linux ma su Sun o IBM (se non si è / fortunati a usarne uno nel 2019) questo comando potrebbe non essere disponibile. Invece potresti usare il prcomando per ottenere lo stesso effetto. Dagli esempi sulla pagina collegata è possibile utilizzare quanto segue:

pr -3 word.lst | qprt

per stampare il file word.lstin 3 colonne. Detto questo, questa è solo una parte di una soluzione al tuo problema e per il resto rimando alla risposta @qnimbus.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.