Historiquement, l’un des avantages d’Unix et de Linux est que tout est un fichier et que les fichiers ne sont que des séquences de caractères. Bien sûr, la pratique moderne est que tout n’est pas un fichier, et il y a une prolifération de fichiers avec une structure imposée. Cependant, si vous avez déjà travaillé sur d’anciens systèmes où votre accès aux fichiers était par bloc, vous apprécierez les fichiers de type Unix. Des outils classiques comme awk
, sed
et grep
travailler avec cette idée. Les fichiers ne sont que des caractères. Mais cela a parfois ses problèmes. C’est la motivation derrière un outil appelé Miller, et je pense qu’il mérite plus d’attention car, pour certaines tâches, c’est une bouée de sauvetage.
Le problème
Envisagez d’essayer de traiter un fichier délimité par des virgules, appelé fichier CSV. Il existe de nombreuses variantes à ce type de fichier. En voici une qui définit deux « colonnes ». J’ai délibérément utilisé différents formats de ligne comme test, mais le plus souvent, vous obtenez un format pour l’ensemble du fichier :
Slot,String A,"Hello" "B",Howdy "C","Hello Hackaday" "D","""Madam, I'm Adam,"" he said." E 100,With some spaces! X,"With a comma, or two, even"
La première colonne, Slot, contient les éléments A, B, C, D et E 100. Notez que certains éléments sont cités, mais d’autres non. Dans tous les cas, le contenu de la colonne est B et non « B » car les guillemets ne font pas partie des données.
La deuxième colonne, String, contient un mélange de guillemets, pas de guillemets, d’espaces et même de virgules entre guillemets. Supposons que vous vouliez traiter cela avec awk
. Vous pouvez le faire, mais c’est douloureux. Notez que les guillemets sont échappés à l’aide de guillemets doubles, comme c’est la coutume dans les fichiers CSV. Écrire une expression régulière pour briser cela n’est pas impossible mais douloureux. C’est là qu’intervient Miller. Il connaît les formats de données tels que CSV, JSON, KDVP8 et quelques autres. Il peut également sortir dans ces formats et d’autres comme Markdown, par exemple.
Exécutions d’exemples simples
Parce qu’il connaît le format, il peut traiter le fichier facilement :
$ mlr –icsv chat miller.in
Emplacement=A,Chaîne=Bonjour
Emplacement=B,chaîne=Bonjour
Slot=C,String=Bonjour Hackaday
Slot=D,String=”Madame, je suis Adam,” dit-il.
Slot=E 100,String=Avec quelques espaces !
Slot=X,String=Avec une virgule, ou deux, même
Notez qu’il n’y a pas de commande appelée « miller ». Le nom de la commande est « mlr ». Cette sortie ne serait pas un mauvais format pour un traitement ultérieur avec awk
, mais nous n’avons pas à le faire. Miller peut probablement faire tout ce dont nous avons besoin. Avant de regarder cela, cependant, considérez ce qui se passerait si vous vouliez juste une sortie au joli format :
Pas mal! N’oubliez pas que l’outil ferait la même chose avec JSON et d’autres formats également.
Tant d’options
Le nombre d’options peut être intimidant. Il existe des options pour transmettre ou ignorer les commentaires, traiter les données compressées ou personnaliser un peu le format du fichier d’entrée ou de sortie.
Mais le vrai pouvoir de Miller, ce sont les verbes. Dans l’exemple ci-dessus, le verbe était cat
. Ceux-ci sont principalement nommés d’après les commandes Linux qu’ils dupliquent. Par exemple, cut
supprimera certains champs des données. Le grep
, head
et tail
les commandes font toutes ce que vous attendez.
Il y a aussi beaucoup de nouveaux verbes. Count
vous donnera un décompte de la quantité de données écoulées et filter
est une meilleure version de grep
. Vous pouvez effectuer des jointures, des tris et même des statistiques de type base de données et générer des graphiques à barres textuels.
Le filter
et put
les commandes ont à leur disposition un langage de programmation complet qui contient tout ce que vous vous attendez à trouver dans un langage comme awk
ou alors Perl
.
Ce qui est bien, c’est que lorsque vous souhaitez supprimer un champ ou un tri, vous pouvez vous y référer par son nom (comme « Slot »), et Miller saura ce que vous voulez dire. Il existe un moyen de faire référence aux champs avec des nombres si vous le devez, mais c’est une chose rare dans un script Miller.
Par exemple, si vous avez des données avec des champs « stock » et « réserve » dont vous souhaitez vous débarrasser, vous pouvez écrire quelque chose comme ceci :
mlr --icsv --opprint cut -f stock,reserve inventory.csv
Ou, peut-être voulez-vous sélectionner des lignes où le stock est « N »:
mlr --icsv --opprint filter '$stock == "N"' inventory.csv
Allez lire
Il n’y a tout simplement pas assez de place pour couvrir toutes les fonctionnalités de ce programme puissant. Je vous suggère de consulter Miller en 10 minutes qui fait partie de la documentation officielle. Vous aurez toujours besoin de lire la documentation plus en détail, mais au moins vous aurez un bon départ.
Ne vous méprenez pas, nous aimons toujours awk. Avec un peu de travail, vous pouvez lui faire faire presque n’importe quoi. Mais si vous pouvez travailler moins avec Miller, pourquoi pas ?