Wie färbe ich Ausgabespalten von ls?

8

Der Titel sagt schon alles: Ich möchte diese sauberen farbigen Spalten der Ausgabe von etwas bekommen, wie zum ls -alBeispiel in 10basetoms Antwort auf diese Frage .

Screenshot des durch die Syntax hervorgehobenen Codeausschnitts aus der verknüpften Antwort

Pirx
quelle
Nun, das ist eine nette Idee! Aber auf welchem ​​Betriebssystem bist du?
JakeGould
2
Das scheint (fälschlicherweise) Bash-Syntax zu sein, die von der SE-Software hervorgehoben wird. Sieht so aus, als wäre es nicht nach Spalten gefärbt, sondern Ziffern (Zahlen) erhalten eine Farbe und alles, was mit einem Großbuchstaben beginnt, erhält eine andere. Das Färben pro Spalte ist machbar, aber ziemlich unterschiedlich.
Bob
3
Im Allgemeinen können Sie die Ausgabe auf den Spaltentrennzeichen mit sedoder aufteilen awkund eine ANSI-Escape-Sequenz einfügen .
Bob
Siehe auch: superuser.com/q/665274
Tyson
Ich bin auf dem Windows 10 Ubuntu-Subsystem, aber ich wechsle zu macOS (angesichts der vollständigen Katastrophe, die sich als WinX herausstellte ...)
Pirx

Antworten:

8

Dies ist machbar mit awk. Da das Format von ls -lnicht angegeben ist, ist es leider nicht möglich, eine Lösung zu finden, die auf jedem System funktioniert, sodass auf einigen Systemen eine Anpassung der Farbe für welche Spalte erforderlich ist.


Zunächst möchten wir die ursprünglichen Räume beibehalten, die von verwendet werden ls -l. Andernfalls ist die Spaltenausrichtung falsch. FPATDank dieser SO-Antwort können wir dies mit der Option tun :

ls -la | awk '
    BEGIN {
        FPAT = "([[:space:]]*[^[:space:]]+)";
        OFS = "";
    }

In awkjeder Positions param ( $1, $2bezieht sich auf einen, etc.) Bereich, dh eine Spalte auf der aktuellen Zeile. Mit der FPATobigen Option wird jedes Feld neu definiert, um alle vorhergehenden Leerzeichen einzuschließen. Wenn Sie printes also zurücksetzen, werden die Leerzeichen beibehalten, sodass die Spalten an derselben Position bleiben.

Jetzt können wir einfach jedes Feld bearbeiten, um den Farbcode einzufügen , und dann die bearbeitete Ausgabe drucken:

    {
        $2 = "\033[31m" $2 "\033[0m";
        $3 = "\033[36m" $3 "\033[0m";
        $4 = "\033[36m" $4 "\033[0m";
        $5 = "\033[31m" $5 "\033[0m";
        $6 = "\033[36m" $6 "\033[0m";
        $7 = "\033[36m" $7 "\033[0m";
        $8 = "\033[31m" $8 "\033[0m";
        print
    }
'

Beachten Sie, dass jede Spalte anschließend auf die Standardeinstellungen ( 0zwischen [und m) zurückgesetzt wird. Wenn die Farbe mehrere Spalten umfassen soll, können Sie diesen Code weglassen. Ich persönlich bevorzuge es, jede Spalte einzeln anzugeben.


Sie können den Befehl a wiederverwendbar in Ihrem definieren .bashrc. Zum Beispiel:

lsc() {
    ls -la | awk '
        BEGIN {
            FPAT = "([[:space:]]*[^[:space:]]+)";
            OFS = "";
        }
        {
            $2 = "\033[31m" $2 "\033[0m";
            $3 = "\033[36m" $3 "\033[0m";
            $4 = "\033[36m" $4 "\033[0m";
            $5 = "\033[31m" $5 "\033[0m";
            $6 = "\033[36m" $6 "\033[0m";
            $7 = "\033[36m" $7 "\033[0m";
            $8 = "\033[31m" $8 "\033[0m";
            print
        }
    '
}

Möglicherweise müssen Sie Ihre bashSitzung neu starten (oder ausführen source ~/.bashrc), damit diese Funktionsdefinition ausgeführt werden kann.

Von hier aus können Sie einfach anrufen lsc, um die gewünschte Ausgabe zu erhalten:

Screenshot der farbigen Ausgabe

Bob
quelle
Tolle Jungs, das ist fast das, was ich will ;-) Im Ernst, ich möchte noch einen Twist hinzufügen und die Dateinamen farbig machen. ls -al --color = auto würde das tun, aber wenn ich nur die Option --color zu den obigen Lösungen hinzufüge, scheinen die Farbcodes entfernt zu werden. Können wir awk bekommen, um diese zu behalten?
Pirx
Zweiter Kommentar, dies ist eher aus Neugier: In der Antwort, auf die ich in meiner ursprünglichen Frage verwiesen habe, sieht es so aus, als hätte 10basetom keine der oben genannten verwendet und hatte immer noch die farbigen Spalten. Ich frage mich, ob das daran liegt, dass er eine andere Version von ls oder ein schickes Smart Terminal verwendet hat.
Pirx
@Pirx Die Farbe in der Antwort wird von der Stack Exchange-Software angewendet. Es kommt nicht von ihrem Terminal. Dies liegt nur daran, dass die Ausgabe in einen Codeblock eingefügt wurde und die Frage ein Bash- Tag hatte, das automatisch versucht, die Hervorhebung der Bash-Syntax auf alle Code-Tags in der Frage und den Antworten anzuwenden ... was in diesem Fall tatsächlich falsch ist. Aus demselben Grund sind die Zeichenfolgen im Code in meiner Antwort rot, obwohl ich sie nicht absichtlich eingefärbt habe.
Bob
1
@ Pirx verwenden --color=always. Solange Sie keine unterschiedlichen Farben auf die Dateinamensspalte anwenden ( $9in meinem Beispiel), awksollten Sie diese durchlaufen.
Bob
@Pirx Randnotiz, --color=alwaysist eine GNU-Erweiterung. Wenn Sie also auf einem Nicht-GNU-System (z. B. macOS, andere BSDs) arbeiten, müssen Sie entweder die GNU-Version installieren oder eine Alternative verwenden .
Bob
6

Dadurch wird die zweite Spalte ls -alFin Rot, die dritte bis achte in Blau und die neunte in Schwarz gedruckt :

ls -alF | awk -v black=$(tput setaf 0) -v red=$(tput setaf 1) -v blue=$(tput setaf 4) '{$2=red $2; $3= blue $3; $9=black $9} 1'

Dies ist nur als Beispiel gedacht. Sie können dies nach Herzenslust anpassen.

Für diejenigen, die ihren Code bevorzugen, der über mehrere Zeilen verteilt ist:

ls -alF | awk -v black=$(tput setaf 0) \
    -v red=$(tput setaf 1) \
    -v blue=$(tput setaf 4) \
    '{
        $2=red $2
        $3= blue $3
        $9=black $9
     }

     1'

Einzelheiten

tputist ein Dienstprogramm zum Generieren einer Vielzahl von Steuercodes für Ihr Terminal. Legt beispielsweise tput setaf ndie Vordergrundfarbe so fest, ndass nsie zwischen 0 und 7 liegen kann

0  Black
1  Red
2  Green
3  Yellow
4  Blue
5  Magenta
6  Cyan
7  White

Weitere Informationen tputund Farbfunktionen finden Sie hier .

Das awk Code definiert Variablen black, redund bluedaß den Anschluß enthält Codes für schwarz, rot und blau ist. Diese Codes stehen am Anfang jeder Spalte, die wir einfärben möchten.

Ein Trick ist, dass Farbcodes nicht von selbst zurückgesetzt werden. Unabhängig von der letzten Farbe, die Sie in einer Zeile angeben, ist die Standardfarbe für die nächste Zeile, sofern kein anderer Farbbefehl angegeben ist.

John1024
quelle
1
Huh, guter Aufruf zur Definition von Variablen. Wusste nicht, dass du das von innen machen kannst awk! Ich würde vorschlagen, dass Sie das Muster einschließen, um auch die Spaltenausrichtung beizubehalten :)
Bob
@ Bob Und ich mag deinen FPATTrick, um den Abstand korrekt zu halten.
John1024