imprimir salida en 3 columnas separadas

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)

¿Cómo puedo imprimir con elegancia esta información de 5 archivos en columnas con encabezados?

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

y así sucesivamente 5 archivos

total files: $TOTALFILE

¿Hay alguna manera fácil de obtener lo que quiero?

nota: esta salida que obtuve cuando echo todas las variables

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
fuente
Obtuviste tres respuestas a tu pregunta, que abordan todas las cosas que preguntas. Debe ser mucho más preciso en lo que quiere obtener una respuesta específica.
Bernhard

Respuestas:

25

Puede usar el comando de shell 'columna' para eso, verifique: columnpágina MAN .

Combine esto con un bucle y estará en el negocio, por ejemplo:

#!/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
fuente
Necesitaba un mayor control de lo que había en qué columna, así que dividí las columnas en '*' y usé algo así como sed 's/^/ \* \*/g'para cambiar las cosas de la primera columna a la tercera. Trabajó un placer para mí.
LOAS
28

Yo recomendaría usar printf, por ejemplo:

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

Donde %-30s significa reservar 30 caracteres para el argumento de entrada de tipo cadena. El -denota la alineación izquierda.

Bernhard
fuente
2

Yo iría con un bucle

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
fuente
Te di cómo no la solución. Ahora necesita adaptar su código para que el ARCHIVO DE NOMBRE DE ARCHIVO y TOPLINE se cuiden dentro del bucle en lugar de hacerlo antes del bucle.
BitsOfNix
Necesita citar todas sus expansiones, o esto se romperá fácilmente.
Chris Down
2

No estoy seguro de si esto es lo que está haciendo, "pegar" en Unix puede organizar los archivos en la columna, es posible que necesite printf para formatear el sttdout. ejemplo:

columna

Ellos Huyen
fuente
3
Bienvenido a U&L, no publique texto como imagen, puede copiar / pegar fácilmente.
Archemar
1
Estoy de acuerdo - copiar y pegar. Todavía no puedo votar, así que comente en su lugar
KolonUK
1

La respuesta de @qnimbus es probablemente la mejor para los sistemas Linux, pero en Sun o IBM (si no tiene la suerte de usar uno en 2019), este comando puede no estar disponible. En su lugar, podría usar el prcomando para obtener el mismo efecto. De los ejemplos en la página vinculada puede usar lo siguiente:

pr -3 word.lst | qprt

para imprimir el archivo word.lsten 3 columnas. Dicho esto, esto es solo una parte de una solución a su problema y, por lo demás, difiero a la respuesta @qnimbus.

tonto
fuente