Un Script de recherche rapide

Gazette Linux n°170 — Janvier 2010

Ben Okopnik

Eric Gérard

Adaptation française  

Gaël Montreuil

Relecture de la version française  

Article paru dans le n°170 de la Gazette Linux de janvier 2010.

Cet article est publié selon les termes de la Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Table des matières

Eviter aux scripts shell d'exploser
Utilisation
n comme modéle
À propos de l'auteur

Après des années passées à travailler sur ordinateurs, l'âge venant, associé à une moins grande faculté de mémorisation, j'ai découvert l'intérêt d'avoir un moyen rapide d'accéder aux informations importantes. Par exemple, je possède un fichier crypté, protégé par un mot de passe, contenant tous mes mots de passe ainsi que toutes les informations qui leurs sont reliées (nom d'hôte, identifiant, questions de sécurité, etc.) ainsi qu'un script qui me permet de visualiser les informations et de les modifier en toute sécurité; Je possède également un fichier de citations que j'ai rassemblées au fil des 20 dernières années ainsi qu'un script pour les visualiser et en ajouter de nouvelles facilement. Dans cet article, je vous décrirai un autre script, similaire, qui me permet de garder une trace des commandes fréquemment utilisées et des trucs divers et variés que j'utilise avec Linux, Solaris et autres.

Pour ceux qui sont familiers avec la terminologie des bases de données, ce script est une version minimale d'une interface de CRUD (créer, lire, mettre à jour et supprimer), sans l'option suppression car en tant que vieil administrateur de bases de données, je considère l'idée même, de supprimer des données, déplaisante. La mise à jour est un moyen d'insérer une nouvelle donnée avec une chaine de recherche distincte, et si vous ajoutez quelque chose dont vous n'aurez plus besoin plus tard, tout ce que aurez à faire c'est de ne pas la consulter.

Eviter aux scripts shell d'exploser

Une des choses que j'ai apprises en écrivant et en utilisant ce type de script est qu'ils sont plein de pièges. A chaque fois que vous écrivez quelque chose qui contient des informations lisibles par un humain et que vous essayez de l'analyser, vous allez faire face à des problèmes d'interface. Non seulement parce que les données elles même sont suspectes - bien que ce ne soit pas la question ici, où l'information est juste un bloc notes - mais aussi parce que les interactions de l'utilisateur avec le script créent des cas limites partout. Au résultat, 99% du script consiste à tester les mauvaises entrées de l'utilisateur; la partie réellement fonctionnelle du script représente environ une douzaine de lignes. Le coté le plus amusant de, comment les actions peuvent planter le script, est ce que vous obtenez lorsque vous exécutez le script après ne pas l'avoir utilisé pendant un moment et que vous avez oublié ses astuces: même moi, l'auteur du script, j'ai réussi à le planter à l'occasion! Ces occasions ont toujours été suivies de malédictions mi-amusées, mi-frustrantes - jusqu'à ce qu'il ne reste plus rien à corriger (au moins concernant les problèmes que j'avais rencontrés, trouvés, imaginés ou créés). Comme toujours, j'apprécie tout retour, si quelqu'un découvre un problème que je n'ai pas trouvé!

Utilisation

Sur mon système, le script est simplement nommé n - pour autant que je me souvienne, j'avais pensé à 'note' au moment où je l'ai nommé. Vous pouvez télécharger la dernière version ici, la version sur le serveur LG n'étant pas forcement à jour; ce script n'a pas changé depuis un moment.

Les options d'utilisation de ce script sont d'une grande simplicité, et peuvent être obtenues en invoquant le script suivi de l'argument '-h' ou '--help':

ben@Jotunheim:~$ n -h

  n [-h|--help] | [section] [comment_search_string]
  
  If invoked without any argument, asks for the section and entry text to
  be added to the data file. If an argument is provided, and matches an
  existing section, that entire section is displayed; if two arguments
  are supplied, displays the first entry matching arg[2] in the section
  matching arg[1].

Voici un exemple d'ajout d'une nouvelle entrée:

ben@Jotunheim:~$ n 
Current sections:
awk
date
find
grep
mencoder
misc/miscellany/miscellaneous/general
mount
mp3/ogg/wav
mplayer
netstat
perl
shell/bash/ksh
sort
tcpdump
vi/vim
whois
Please enter the section to update or a new section name: perl 
Please type in the entry to be added to the 'perl' section:
# Interactive Perl debuggerperl -d scriptname
ben@Jotunheim:~$

Notez que chaque entrée requiert un commentaire en première ligne et doit être suivie d'une ligne vide. Le commentaire peut être continué sur les lignes suivantes, et ceci est important: la recherche par défaut (qui peut être modifiée dans le script) se fait seulement dans les commentaires lorsque le script cherche une donnée spécifique dans une section. En d'autres termes, si je veux retrouver l'entrée ci-dessus, je recherche en écrivant n perl debug

Cette commande retournera chaque entrée contenant « debug » dans le commentaire dans la section « perl ». Si vous voulez effectuer une recherche moins précise, c'est à dire une recherche qui cible à la fois le commentaire et le contenu, vous pouvez modifier la variable search_opt située dans le haut du script décrit ci-dessus. Personnellement, je préfère la recherche sur « commentaire seulement » - je tiens compte de ma « Google-fu », c'est à dire, de ma capacité à formuler une bonne requête de recherche. L'astuce est que j'utilise la même chose, le même mode de pensée, quand je crée un commentaire pour une donnée entrée: j'écris un commentaire pratiquement équivalent à une requête de recherche même si je n'ai plus aucun souvenir de ce que j'ai originellement écrit.

Jusqu'ici, c'est simple mais ce n'est pas tout. La partie délicate concerne les caractéristiques éventuellement surprenantes qui sont les conséquences naturelles des outils que j'ai utilisés pour écrire le script. Car, comme j'utilise les capacités regex de sed pour rechercher dans les sections et les lignes, les arguments fournis au script peuvent également être des regex - au moins si nous prenons soin de les protéger des expansions de l'interpréteur en utilisant de simples guillemets de part et d'autre. Avec ceci, le script devient plus utile, puisque vous pouvez maintenant rechercher plus de chaines arbitraires avec plus de liberté. Par exemple, si je me souviens que j'avais une entrée contenant 'tr' dans une section, je peux demander à n de rechercher 'tr' dans les commentaires de toutes les sections:

n '.*' tr

Cependant, si la recherche ci-dessus renvoie trop de réponses (cela se pourrait car 'trailing', 'matrix', 'control' etc. vont tous correspondre), je peux demander à n de chercher 'tr' comme mot - par exemple une chaine entourée de caractères non alphanumériques:

n '.*' '\<tr\>' 

Ceci renverra uniquement ce que je cherche.

Je peux également rechercher des données dans plus d'une section à la fois, au moins si je me souviens comment utiliser le style sed dans les expressions régulières:

n 'perl\|shell' debug

Ceci recherchera toutes les données contenant 'debug' dans les commentaires des deux sections 'perl' et 'shell'.

On peut également faire l'inverse:

n perl 'text\|binary'

ou alors :

n 'awk\|perl' 'check\|test'

L'une des options pratiques, lorsque l'on crée une nouvelle section, est d'utiliser plusieurs noms de section - autrement dit, il pourrait y avoir plus d'un nom de section qui aurait un sens lorsque j'effectuerai une recherche. Par exemple, pour les trucs et astuces sur l'écriture de shell, je peux penser au mot « shell » mais aussi à « bash », « ksh » voire même « sh » en premier. (Notez que ce cas ne pose pas de problème: n l'ignore lorsqu'il effectue une recherche sur les noms de section). Que faire? En fait, c'est assez facile: n autorise plusieurs noms dans une section donnée tant que ce sont des mots séparés, ce qui veut dire séparés par des caractères non alphanumériques excepté le tiret bas (tiret du 8). Ainsi, si vous nommez une section « KSH/sh/Bash/shell/script/scripting », n'importe quel mot, parmi ceux-ci, spécifié comme nom de section, permettront une recherche au bon endroit.

Comme les données sont contenues dans un fichier texte, vous pourrez toujours l'éditer pour corriger une erreur. (Le nom et la position du fichier, ~/.linux_notes, sont définis en haut du script, chaque utilisateur peut avoir le sien ou en partager un). Vérifiez simplement le format, qui est très simple: les noms de section commencent par « ### » en début de ligne, les commentaires commencent par « # » en début de ligne et les données et sections sont séparées par une ligne vide. Si, d'aventures, vous commettez une erreur, ce n'est pas un gros problème, car le fichier est évalué ligne par ligne, chaque entrée est individuelle, et grâce à la conception du script, le processus est assez robuste. (Par exemple, plusieurs lignes vides c'est bon, utiliser plusieurs # au début d'un commentaire c'est bon; oublier de laisser des lignes vides entre les différentes entrées donnera un résultat où les données seront « connectées » entre elles). Même dans le pire des cas, la sortie sera lisible et utilisable, et les réparations à faire seront évidentes et faciles.

n comme modéle

Une des choses, que j'aimerais que les lecteurs de LG retiennent de cet article, est de considérer n comme un début de leur futur développement de ce type de script. Il y a beaucoup d'occasions où voudrez utiliser une interface de « recherche et mise à jour », et n est un modèle que j'ai utilisé encore et encore dans ces cas là avec quelques ajustements mineurs. Comme ce script est publié sous la licence GNU, vous êtes libres d'affiner, améliorer et réécrire comme vous le souhaitez. Encore une fois, j'apprécierai d'être informé des améliorations intéressantes!

À propos de l'auteur

Ben est éditeur en chef de la Gazette linux et un membre d'Answer Gang.

Ben est né en Russie à Moscou en 1962. Il s'est intéressé à l'électricité à l'age de 6 ans en enfoncant une fourchette dans une prise de courant électrique déclenchant, ainsi, un feu, depuis il n'a jamais cessé de s'intéresser à la technologie. Il travaille avec des ordinateurs depuis le début, quand ils devaient être construits en soudant des composants électroniques sur des circuits imprimés et que les programmes devaient tenir dans 4 ko de mémoire (ses cauchemars récurrents ont diminué depuis).

Ses expériences suivantes comprennent l'écriture de programmes dans plus de deux douzaines de langages différents, les réseaux, la maintenance des bases de données pendant l'arrivée d'un ouragan, l'écriture d'articles publiés dans les revues de voile aux journaux techniques, l'enseignement d'une grande quantité de sujets alland de l'armement russe et la réparation de matériel IBM à l'admistration de systèmes Linux et solaris, l'ingénierie et la programmation. Il a également mis en place le premier réseau public basé sur système Linux à St Georges aux Bermudes ainsi qu'un des premiers serveurs de courrier à grande échelle sur système Linux à St Thomas aux Iles Vierges américaines.

Après sept années passées en croisière à la voile dans les Caraïbes et le long de la côte est des Etats-Unis, il est actuellement au mouillage dans le nord de la Floride. Sa société de conseil lui apporte une grande variété de défis comme l'enseignement de cours avancés pour Sun Microsystems et la fourniture de solutions Open Source pour des sociétés locales.

Ses loisirs sont le vol, le yoga, les arts martiaux, les motos, l'écriture, l'histoire de Rome et les jeux sur son réseau privé basé sur système Ubuntu dans lesquels il est secondé par sa femme et son fils; son Palm Pilot est truffé d'alarmes, la plupart d'entre elles contenant des points d'exclamation.

Il travaille sur Linux depuis 1997, ce qui lui a valu sa perte d'intérêt pour une guerre nucléaire quelque part dans le nord ouest du Pacifique.

Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site : http://www.traduc.org/Gazette_Linux.

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.