Wie färben Sie Ausgabespalten von ls ein?

1420
Pirx

Der Titel sagt alles aus: Ich würde gerne diese sauberen farbigen Spalten der Ausgabe von etwas erhalten, wie ls -aletwa in 10basetoms Antwort auf diese Frage .

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

8
Nun, das ist eine nette Idee! Aber in welchem ​​Betriebssystem bist du? JakeGould vor 6 Jahren 0
Das scheint (falsch) von der SE-Software hervorgehoben zu sein. Sieht aus, als wäre sie nicht durch eine Spalte gefärbt, sondern Ziffern (Zahlen) erhalten eine Farbe und alles, was mit einem Großbuchstaben beginnt, erhält eine andere. Die Einfärbung pro Spalte ist machbar, jedoch etwas anders. Bob vor 6 Jahren 2
Im allgemeinen Sinne können Sie die Ausgabe auf den Spaltentrennern mit `sed` oder` awk 'aufteilen und eine [ANSI-Escape-Sequenz] (https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_ (Select_Graphic_Rendition )_Parameter einfügen ). Bob vor 6 Jahren 3
Verwandte Themen: https://superuser.com/q/665274 Tyson vor 6 Jahren 0
Ich bin auf dem Windows 10 Ubuntu-Subsystem, wechsle aber zu macOS (angesichts des kompletten Desasters, das sich WinX als erwies ...) Pirx vor 6 Jahren 0

2 Antworten auf die Frage

8
Bob

Das ist mit machbar 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. Daher ist auf einigen Systemen eine Anpassung der Farbe für welche Spalte erforderlich.


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

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

In bezieht sich awkjeder Positionsparameter ( $1, $2usw.) auf ein Feld, dh eine Spalte in der aktuellen Zeile. Die FPATOption oben hat jedes Feld neu definiert, um alle vorhergehenden Leerzeichen einzuschließen. Wenn Sie printes wieder herausnehmen, 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 danach jede Spalte auf den Standard (das 0zwischen dem [und m) zurückgesetzt wird. Wenn Sie möchten, dass die Farbe über mehrere Spalten verläuft, können Sie den Code weglassen. Ich persönlich bevorzuge es, jede Spalte unabhängig voneinander anzugeben.


Sie können einen wiederverwendbaren Befehl 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 } ' } 

Sie müssen möglicherweise 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, was Ihnen die gewünschte Ausgabe geben sollte:

Screenshot der farbigen Ausgabe

Tolle Jungs, das ist * fast * das, was ich will ;-) Im Ernst, ich möchte noch eine weitere Drehung hinzufügen und die Dateinamen farbig machen. ls -al --color = auto würde das tun, aber wenn ich einfach die Option --color zu den obigen Lösungen hinzufüge, scheinen die Farbcodes zu verschwinden. Können wir uns dazu bringen, diese zu behalten? Pirx vor 6 Jahren 0
Zweiter Kommentar, das ist mehr aus Neugierde: In der Antwort, auf die ich in meiner ursprünglichen Frage verwiesen habe, sieht es aus, als hätte 10basetom keines der oben genannten verwendet und hatte immer noch die farbigen Säulen. Ich frage mich, ob das daran liegt, dass er eine andere Version von ls oder ein schickes intelligentes Terminal verwendet? Pirx vor 6 Jahren 0
@Pirx Die Farbgebung 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 [tag: bash] -Tag hatte, das automatisch versucht, die Bash-Syntaxhervorhebung auf alle Codetags in den Fragen und 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 vor 6 Jahren 0
@Pirx Verwenden Sie "--color = always". Solange Sie der Dateinamen-Spalte keine anderen Farben zuweisen (in meinem Beispiel "$ 9"), sollte "awk" sie durchlassen. Bob vor 6 Jahren 1
@Pirx Hinweis: `--color = always` ist eine GNU-Erweiterung. Wenn Sie sich auf einem Nicht-GNU-System befinden (z. B. macOS oder andere BSDs), müssen Sie entweder die GNU-Version installieren oder [eine Alternative] verwenden. (https://unix.stackexchange.com/a/72804/33227). Bob vor 6 Jahren 0
Hah, danke, das macht den Trick. Ich habe die GNU-Coreutils (und einige andere, einschließlich der neuesten Version von bash) auf meinem Mac installiert, also bin ich gut in dieser Hinsicht. Pirx vor 6 Jahren 0
6
John1024

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 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' 

Einzelheiten

tputist ein Dienstprogramm zum Generieren einer Vielzahl von Steuercodes für Ihr Terminal. Zum Beispiel tput setaf nsetzt die Vordergrundfarbe zu ndem n0-7 reichen kann

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

Sie können mehr über lesen tputund seine Farbe Fähigkeiten hier .

Der awk-Code definiert Variablen black, redund bluediese enthalten die Terminalcodes für Schwarz, Rot und Blau. Diese Codes werden am Anfang der Spalte eingefügt, 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, wird die Standardfarbe für die nächste Zeile verwendet, sofern kein anderer Farbbefehl angegeben wird.

Huh, guter Aufruf zur Definition von Variablen. Ich wusste nicht, dass Sie das von "awk" aus tun könnten! Ich würde vorschlagen, dass Sie das Muster einfügen, um auch die Ausrichtung der Spalten zu erhalten :) Bob vor 6 Jahren 1
@ Bob Und ich mag deinen `FPAT'-Trick, um den Abstand korrekt zu halten. John1024 vor 6 Jahren 0