[LINUX] Sie sollten die Option --color = always des Befehls grep nicht verwenden

TL;DR Verwenden Sie beim Färben von "grep" ** "--color = auto" anstelle von "--color = always" **.

Umgebung

$ zsh --version
> zsh --version
> zsh 5.7.1 (x86_64-apple-darwin17.7.0)

Hintergrund und Probleme

Während Sie mit der Aufgabe fortfahren, können Sie beispielsweise die Zeile extrahieren, in der "col1" oder "col2" eine bestimmte Zeichenfolge aus der CSV-Datei mit der folgenden Struktur ist, und in absteigender Reihenfolge nach dem Wert von "col3" sortieren hätten.

test.csv


col1,col2,col3
a,a,10
a,a_1,20
a,a_2,5
a,a_3,10
a_1,a,25
a_1,a_1,30
a_1,a_2,20
a_1,a_3,10

Angenommen, Sie müssen eine Zeile extrahieren, in der der Wert von "col1" oder "col2" "a" ist. Ich habe einfach den folgenden Befehl ausgeführt und dachte, ich sollte die gewünschte Ausgabe erhalten, indem ich grep mit a, sortiere.

Terminal


$ grep 'a,' test.csv | sort -t ',' -k 3 -rn

Ausgabe


a,a_1,20
a,a_3,10
a,a_2,5
a_1,a,25  #Nicht numerisch sortiert
a,a,10    #Das gleiche wie oben

Das? Warum werden die 4. und 5. Zeile nicht in absteigender Reihenfolge sortiert? Wenn ich das Verhalten mit "sort" alleine ohne Verwendung einer Pipe ausprobiert habe, scheint es, dass eine absteigende Sortierung mit "col3" problemlos ausgeführt werden kann. Wenn ja, gibt es eine Ursache in "grep"? Dutzende Minuten (es ist schwer), mit Atari einen Versuch und Irrtum zu machen. Als ich versuchte, die Ausgabe des fraglichen Befehls in eine Datei umzuleiten, fand ich schließlich die Ursache heraus.

Ursache

Nachfolgend finden Sie den Inhalt der Umleitung der Ausgabe des vorherigen Befehls in eine Textdatei.

a,a_1,20
a,a_3,10
a,a_2,5
a_1,a,25
a,a,10

Auf den ersten Blick war ich verwirrt von "Nanikore?", Aber als Ergebnis meiner Recherchen stellte ich fest, dass dieses Sonderzeichen ** ANSI-Escape-Code ** zum Färben war. Da ich in ".zshrc" "export GREP_OPTIONS =" - color = always "" gesetzt habe, wurde in den Teil, der dem Suchmuster von "grep" entspricht, ein Sonderzeichen zum Färben eingefügt. Das Problem ist diesmal, dass es dazu führte, dass "col3" in der 4. und 5. Zeile zu einer nicht interpretierbaren Zeichenkette wurde und die absteigende numerische Sortierung nicht gut funktionierte. Als ich herausfand, dass die Farbeinstellung die Ursache war, habe ich die obige Zeile auskommentiert und erneut ausgeführt, und es hat wie erwartet funktioniert.

--Color Option von grep

"Aber es ist einfacher zu sehen, ob Sie es einfärben können, gibt es nicht etwas?" Als ich die "- Farbe" von "grep" nachschlug, konnte ich entweder "nie", "automatisch" oder "immer" angeben. Ich fand, dass jeder die folgenden Spezifikationen hat.

--nie: Nicht färben --auto: ** Farbe nur, wenn der Standardausgang an das Terminal angeschlossen ist ** Farbe (nicht färben, wenn Rohre oder Umleitungen) -- immer: Immer färben (** ändert die Zeichenkette, was sich auf die nachfolgende Verarbeitung auswirkt **)

Wenn man es so betrachtet, scheint es, dass der Wert der Einstellung ** --color = always im Grunde genommen dünn ist **. "Auto" reicht wahrscheinlich aus, um Aliase und Umgebungsvariablen für eine bessere Sichtbarkeit anzugeben. Wenn es eine Ausnahme gibt, ist es eine Situation, in der das Ergebnis von "grep" lang wird und zum Anzeigen an "less" übergeben wird? Die Option "--color" von "grep" wird zur Laufzeit der Option "Umgebungsvariable" vorgezogen. Wenn Sie sie also nur dann als "grep --color = always" an "less" weiterleiten Ich denke, ich kann meinen Zweck erreichen.

Artikel, die ich als Referenz verwendet habe

Färben Sie den Befehl grep Different results in grep results when using --color=always option

Lektion

Die Hauptursache für das Problem war, dass ich zu Beginn des Schreibens des Programms eine Terminalumgebung mit dem Wissen erstellte, das ich gehört hatte: "Es scheint, dass zsh vorerst eine höhere Funktionalität als bash hat" und "Es scheint zweckmäßig, diese Einstellung zu verwenden." Es war da. Es ist ganz natürlich, aber wenn Sie den Code und die Einstellungen des Pioniers verwenden, ist es wichtig, den Zweck und den Umfang des Einflusses richtig zu erkennen ... Ich denke jedoch, dass Sie diese Denkweise nur dann beibehalten können, wenn Sie über systematisches Wissen verfügen. Deshalb möchte ich mich weiterhin diesem Thema widmen.

Es war eine wertvolle Gelegenheit zur Selbstdisziplin in dem Sinne, dass mich die ".zshrc", die ich in der Vergangenheit beiläufig kopierte, im Laufe der Zeit beunruhigte. Ich hoffe, dieser kleine Suchtfall hilft jemandem.

Recommended Posts

Sie sollten die Option --color = always des Befehls grep nicht verwenden
Verwendung des Befehls grep und häufiger Samples
Was Sie bei der Zeitreihendatenanalyse (einschließlich Reflexion) nicht tun sollten
Eine Sammlung von Befehlen, die Sie kennen sollten, indem Sie die Ursache für die Fehlerbehebung isolieren (Server Edition).
Grep, damit grep zum Zeitpunkt von grep nicht angezeigt wird
Erklären Sie den Mechanismus von Linux, den Sie nicht unerwartet kennen
Warum Pandas verwenden? Apply ()
Technisches Englisch> Sie verwenden die booleschen Operatoren [und, oder und nicht], um ...> Boolesche Operationen - und oder oder nicht
Warum sollten Sie urlopen anstelle von urlretrieve verwenden, um Python-Dateien herunterzuladen?
[Linux] Warum verwende ich als Infrastrukturingenieur nicht den Befehl "Hostname"?