Vous ne devez pas utiliser l'option --color = always de la commande grep

TL;DR Lors de la coloration de grep, utilisez ** --color = auto au lieu de --color = always **.

environnement

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

Contexte et problèmes

Dans le processus de poursuite de la tâche, un traitement tel que l'extraction de la ligne où «col1» ou «col2» est une chaîne de caractères spécifique du fichier CSV avec la structure suivante et le tri dans l'ordre décroissant de la valeur de «col3». eu.

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

Par exemple, supposons que vous ayez besoin d'extraire une ligne où la valeur de «col1» ou «col2» est «a». J'ai simplement exécuté la commande suivante, pensant que je devrais obtenir la sortie souhaitée en triant grep avec ʻa,.

Terminal


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

production


a,a_1,20
a,a_3,10
a,a_2,5
a_1,a,25  #Pas de tri numérique
a,a,10    #Comme ci-dessus

cette? Pourquoi les 4e et 5e lignes ne sont-elles pas triées par ordre décroissant? Quand j'ai essayé le comportement avec sort seul sans utiliser de tuyau, il semble que le tri descendant avec col3 puisse être exécuté sans problème. Si oui, y a-t-il une cause dans grep? Des dizaines de minutes (c'est difficile) pour faire un essai et une erreur avec Atari. Lorsque j'ai essayé de rediriger la sortie de la commande en question vers un fichier, j'ai finalement trouvé la cause.

Cause

Vous trouverez ci-dessous le contenu de la redirection de la sortie de la commande précédente vers un fichier texte.

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

À première vue, j'étais confus par "Nanikore?", Mais à la suite de mes recherches, j'ai trouvé que ce caractère spécial était ** code d'échappement ANSI ** pour la coloration. Comme j'avais l'habitude de définir ʻexport GREP_OPTIONS = "- color = always" dans .zshrc, un caractère spécial pour la coloration a été inséré dans la partie qui correspondait au modèle de recherche de grep`. Le problème cette fois-ci est que "col3" sur les 4ème et 5ème lignes est devenu une chaîne de caractères non interprétable, et le tri numérique décroissant n'a pas bien fonctionné. Lorsque j'ai découvert que le paramètre de coloration en était la cause, j'ai commenté la ligne ci-dessus et l'ai exécutée à nouveau, et cela a fonctionné comme prévu.

Option --Color de grep

«Mais il est plus facile de voir si vous pouvez le colorier, et je me demande s'il y a quelque chose», et quand j'ai recherché le «--color» de «grep», l'un des «jamais», «auto», «toujours» peut être spécifié. , J'ai trouvé que chacun a les spécifications suivantes.

--never: ne pas colorer --ʻAuto: ** Couleur uniquement lorsque la sortie standard est connectée au terminal ** Couleur (ne pas colorer lors des tuyaux ou des redirections) --ʻAlways: Coloration permanente (** change la chaîne de caractères, ce qui affecte le traitement ultérieur **)

En regardant les choses comme ça, il semble que le mérite de définir ** --color = always est fondamentalement mince **. ʻAutoest probablement suffisant pour spécifier des alias et des variables d'environnement pour une meilleure visibilité. S'il y a une exception, est-ce une situation où le résultat de «grep» devient long et est passé à «less» pour être visualisé? L'option--color de grep est utilisée de préférence à celle de la variable d'environnement au moment de l'exécution, donc si vous la dirigez vers less as grep --color = always` alors seulement Je pense que je peux atteindre mon but.

Articles que j'ai utilisés comme référence

Colorez la commande grep Different results in grep results when using --color=always option

Leçon

La cause première du problème était que lorsque j'ai commencé à écrire le programme, j'ai construit un environnement de terminal avec les connaissances que j'avais entendues, en disant: "Il semble que zsh a des fonctionnalités supérieures à bash pour le moment" et "Il semble pratique d'utiliser ce paramètre." C'était là. C'est assez naturel, mais lors de l'utilisation du code et des paramètres du pionnier, il est important de reconnaître correctement le but et la portée de l'influence ... Cependant, je pense que ce n'est que si vous avez des connaissances systématiques que vous pouvez maintenir cet état d'esprit, alors je voudrais continuer à m'y consacrer.

C'était une opportunité précieuse d'autodiscipline dans un sens où j'ai été troublé au fil du temps par le .zshrc que j'avais copié par le passé. J'espère que ce petit cas de dépendance aide quelqu'un.

Recommended Posts

Vous ne devez pas utiliser l'option --color = always de la commande grep
Comment utiliser la commande grep et des exemples fréquents
Ce que vous ne devriez pas faire dans le processus d'analyse des données de séries chronologiques (y compris la réflexion)
Une collection de commandes que vous devez connaître en isolant la cause du dépannage (édition serveur)
Grep pour que grep n'apparaisse pas au moment de grep
Expliquer le mécanisme de Linux que vous ne connaissez pas de manière inattendue
Pourquoi utiliser Pandas Apply ()
Anglais technique> vous utilisez les opérateurs booléens [et, ou, et non] pour ...> Opérations booléennes - et, ou, non
Pourquoi vous devriez utiliser urlopen au lieu d'urlretrieve pour télécharger des fichiers Python
[Linux] Pourquoi est-ce que moi, ingénieur d'infrastructure, n'utilise pas la commande "hostname"?