Druckausgabe in 3 separate Spalten


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)

Wie kann ich diese 5 Dateiinformationen elegant in Spalten mit Überschriften ausdrucken?

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

und so weiter 5 Dateien

total files: $TOTALFILE

Gibt es eine einfache Möglichkeit, das zu bekommen, was ich will?

Hinweis: Diese Ausgabe habe ich bekommen, wenn jede Variable echo

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

Sie haben drei Antworten auf Ihre Frage, die sich alle mit den von Ihnen gestellten Fragen befassen. Sie sollten viel präziser sein, was Sie eine bestimmte Antwort erhalten möchten.
Bernhard

Antworten:


25

Sie können dazu den Shell-Befehl 'column' verwenden, siehe: columnMAN-Seite .

Kombiniere dies mit einer Schleife und du bist im Geschäft, zB:

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

Ich brauchte weitere Kontrolle darüber, was in welcher Spalte vor sich ging, also teilte ich die Spalten auf '*' und verwendete so etwas wie, sed 's/^/ \* \*/g'um Dinge von der ersten Spalte in die dritte zu verschieben. Hat mir was Gutes getan.
LOAS

28

Ich würde empfehlen printf, zB:

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

Dabei werden %-30s 30 Zeichen für das Eingabeargument vom Typ string reserviert. Das -kennzeichnet linke Ausrichtung.


2

Ich würde mit einer Schleife gehen

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 

Ich habe dir das wie nicht die Lösung gegeben. Jetzt müssen Sie Ihren Code anpassen, damit FILENAME FILE und TOPLINE innerhalb der Schleife berücksichtigt werden, anstatt dies vor der Schleife zu tun.
BitsOfNix

Sie müssen alle Ihre Erweiterungen angeben, sonst wird dies leicht brechen.
Chris Down

2

Wenn Sie nicht sicher sind, ob Sie dies möchten, können Sie durch "Einfügen" in Unix Dateien in Spalten anordnen. Möglicherweise benötigen Sie printf, um das sttdout neu zu formatieren. Beispiel:

Säule


3
Willkommen bei U & L, bitte posten Sie keinen Text als Bild, Sie können einfach kopieren / einfügen.
Archemar

1
Ich stimme zu - kopieren und einfügen. Ich kann noch nicht abstimmen, also kommentiere stattdessen
KolonUK

1

Die @ qnimbus-Antwort ist wahrscheinlich am besten für Linux-Systeme geeignet, aber unter Sun oder IBM (wenn Sie nicht das Glück haben, 2019 eine zu verwenden) ist dieser Befehl möglicherweise nicht verfügbar. Stattdessen können Sie den prBefehl verwenden , um den gleichen Effekt zu erzielen. In den Beispielen auf der verlinkten Seite können Sie Folgendes verwenden:

pr -3 word.lst | qprt

um die Datei word.lstin 3 Spalten zu drucken . Das heißt, dies ist nur ein Teil einer Lösung für Ihr Problem und für den Rest schiebe ich mich auf @ qnimbus Antwort.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.