Wie färbe ich Ausgabespalten von ls?

Titel sagt irgendwie alles: Ich möchte diese ordentlichen farbigen Spalten der Ausgabe von etwas wie ls -al erhalten, wie in 10basetoms Antwort auf diese Frage.

Screenshot des Syntax-hervorgehobenen Code-Snippets aus der verknüpften Antwort

 8
Author: Bob, 2018-02-13

2 answers

Dies ist mit awk machbar. Da das Format von ls -l nicht spezifiziert 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 Leerzeichen von ls -l beibehalten. Andernfalls ist die Spaltenausrichtung falsch. Wir können dies mit der Option FPAT tun, dank diese SO Antwort:

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

In awk, jeder Positionsparam ($1, $2, etc.) bezieht sich auf ein Feld, d.h. eine Spalte in der aktuellen Zeile. Was die obige Option FPAT getan hat, ist, jedes Feld so neu zu definieren, dass es alle vorhergehenden Leerzeichen enthält, also wenn Sie print es wieder herausholen, behält es die Leerzeichen, so dass die Spalten in der gleichen 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 auf den Standardwert zurückgesetzt wird (die 0 zwischen die [ und m) danach. Wenn Sie möchten, dass die Farbe über mehrere Spalten läuft, können Sie diesen Code weglassen. Persönlich bevorzuge ich es, jede Spalte unabhängig anzugeben.


Sie können den Befehl a wiederverwendbar in Ihrem .bashrc definieren. 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 bash - Sitzung neu starten (oder source ~/.bashrc ausführen), damit diese Funktionsdefinition ausgeführt werden kann.

Von hier aus können Sie einfach lsc aufrufen, was Ihnen die Ausgabe geben sollte, die Sie Wunsch:

Screenshot der farbigen Ausgabe

 8
Author: Bob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-02-14 00:50:54

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

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 auf mehrere Zeilen verteilen möchten:

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'

Details

tput ist ein Dienstprogramm zum Generieren einer Vielzahl von Steuercodes für Ihr Terminal. Zum Beispiel setzt tput setaf n die Vordergrundfarbe auf n wobei n Bereich von 0 bis 7

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

Hier können Sie mehr über tput und seine Farbfähigkeiten lesen.

Der awk-Code definiert Variablen black, red, und blue, die die Terminalcodes für Schwarz, Rot und Blau enthalten. Diese Codes werden am Anfang der Spalte platziert, die wir färben möchten.

Ein Trick ist, dass Farbcodes nicht von selbst zurückgesetzt werden. Also, was auch immer die letzte Farbe, die Sie in einer Zeile angeben, wird, es sei denn, ein anderer Farbbefehl ist angegeben, die Standardfarbe für die nächste Zeile sein.

 6
Author: John1024,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-02-14 00:04:19