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.
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:
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.
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