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

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

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.


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 

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


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.