Guide avancé d'écriture des scripts Bash: | ||
---|---|---|
Précédent | Chapitre 12. Filtres externes, programmes et commandes | Suivant |
Commandes affectant le texte et les fichiers textes
Trieuse de fichier, souvent utilisée dans un tube pour trier. Cette commande trie un flux de texte ou un fichier, ascendant ou descendant, ou selon diverses clés ou positions de caractère. Avec l'option -m, elle combine des fichiers pré-triés. La page info recense ses multiples possibilités et options. Voir Exemple 10-9, Exemple 10-10 et Exemple A-9.
Trie topologique, lisant chaque paire de mots séparés par un espace et triant en fonction des motifs (patterns) lus.
Ce filtre efface les lignes dupliquées depuis un fichier trié. On le voit souvent dans un tube combiné avec un sort.
cat liste-1 liste-2 liste-3 | sort | uniq > liste.finale # Concatène les fichiers liste, # les trie, # efface les lignes doubles, # et enfin écrit le résultat dans un fichier de sortie. |
L'option très utile -c préfixe chaque ligne du fichier d'entrée avec son nombre d'occurence.
bash$ cat fichiertest Cette ligne apparaît une seule fois. Cette ligne apparaît deux fois. Cette ligne apparaît deux fois. Cette ligne apparaît trois fois. Cette ligne apparaît trois fois. Cette ligne apparaît trois fois. bash$ uniq -c fichiertest 1 Cette ligne apparaît une seule fois. 2 Cette ligne apparaît deux fois. 3 Cette ligne apparaît trois fois. bash$ sort fichiertest | uniq -c | sort -nr 3 Cette ligne apparaît trois fois. 2 Cette ligne apparaît deux fois. 1 Cette ligne apparaît trois fois. |
La commande sort FICHIER_ENTREE | uniq -c | sort -nr renvoie un listing du nombre d'occurence du fichier FICHIER_ENTREE (l'option -nr de sort produit un tri numérique inversé). Ce modèle de recherche trouve son utilité dans l'analyse de fichiers de traces et de dictionnaires, ainsi que là où la structure lexicale d'un document doit être examinée.
Exemple 12-8. Analyse de frequence d'apparition de mot
#!/bin/bash # wf.sh: Compte la fréquence de répétition des mots d'un fichier texte # Vérifie si un fichier a été fourni en ligne de commande. ARGS=1 E_MAUVAISARGS=65 E_FICHIERINEXISTANT=66 if [ $# -ne "$ARGS" ] then echo "Usage: `basename $0` nomfichier" exit $E_MAUVAISARGS fi if [ ! -f "$1" ] # Est-ce que le fichier existe ? then echo "Le fichier \"$1\" n'existe pas." exit $E_FICHIERINEXISTANT fi ######################################################## # main () sed -e 's/\.//g' -e 's/ /\ /g' "$1" | tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr # ========================= # Fréquence des occurrences # Enlève les virgules et #+ change les espaces entre les mots en retours chariot, #+ puis met les lettres en minuscule et #+ enfin préfixe avec le nombre d'apparition et #+ effectue un tri numérique. ######################################################## # Exercices: # --------- # 1) Ajouter une commande 'sed' pour supprimer les autres ponctuations, comme #+ les virgules. # 2) Modifier aussi pour filtrer les espaces blancs multiples. # 3) Ajouter un second critère de tri, de façon à ce que le nombre d'occurences #+ similaires soit trié alphabétiquement. exit 0 |
bash$ cat fichiertest Cette ligne apparaît une fois. Cette ligne apparaît deux fois. Cette ligne apparaît deux fois. Cette ligne apparaît trois fois. Cette ligne apparaît trois fois. Cette ligne apparaît trois fois. bash$ ./wf.sh fichiertest 6 Cette 6 apparaît 6 ligne 3 fois 3 trois 2 deux 1 une |
Souvent utilisé dans un tube, expand transforme les tabulations en espaces.
unexpand transforme les espaces en tabulations. Elle inverse les modifications d'expand.
Un outil d'extraction de champs depuis un fichier. Il est similaire à la commande print $N de awk mais en plus limité. Il peut être plus simple d'utiliser cut dans un script plutôt que awk. A noter les options -d (délimitation) et -f (spécification du champ).
Utiliser cut pour obtenir une liste des systèmes de fichiers montés:
cat /etc/mtab | cut -d ' ' -f1,2 |
Utiliser cut pour avoir l'OS et la version du noyau:
uname -a | cut -d" " -f1,3,11,12 |
Utiliser cut pour extraire les entêtes des messages depuis un dossier de courriers électroniques:
bash$ grep '^Subject:' messages-lus | cut -c10-80 Re: Linux suitable for mission-critical apps? MAKE MILLIONS WORKING AT HOME!!! Spam complaint Re: Spam complaint |
Utiliser cut pour analyser un fichier :
# Montre tous les utilisateurs dans /etc/passwd. FICHIER=/etc/passwd for utilisateur in $(cut -d: -f1 $FICHIER) do echo $utilisateur done # Merci à Oleg Philon pour cette suggestion. |
cut -d ' ' -f2,3 fichier est équivalent à awk -F'[ ]' '{ print $2, $3 }' fichier
Voir aussi Exemple 12-33.
Outil pour fusionner ensemble différents fichiers dans un seul fichier multi-colonne. Combiné avec cut, c'est utile pour créer des fichiers de traces.
Considérez-le comme un cousin de paste mais à usage spécifique. Ce puissant outil permet de fusionner deux fichiers d'une façon significative, qui crée essentiellemnt une simple version de base de données relationelle.
join travaille sur deux fichiers mais copie ensemble seulement les lignes qui possèdent un champ commun (un nombre par exemple) et écrit le résultat vers stdout. Les fichiers joints doivent être triés de la même façon sur le champ cible pour que la correspondance fonctionne correctement.
Fichier: 1.donnees 100 Chaussures 200 Bretelles 300 Cure-dents |
Fichier: 2.donnees 100 $40.00 200 $1.00 300 $2.00 |
bash$ join 1.donnees 2.donnees Fichier: 1.donnees 2.donnees 100 Chaussures $40.00 200 Bretelles $1.00 300 Cure-dents $2.00 |
![]() | Les champs marqués apparaîtront seulement une fois dans le résultat. |
Affiche le début d'un fichier sur stdout (par défaut 10 lignes, mais c'est modifiable). Elle possède de nombreuses options.
Exemple 12-9. Quels fichiers sont des scripts ?
#!/bin/bash # script-detector.sh: Detecte les scripts qui sont dans un répertoire. TESTCHARS=2 # Teste les 2 premiers caractères. SHABANG='#!' # Les scripts commencent toujours avec un "#!" for fichier in * # Scanne tous les fichiers du répertoire courant. do if [[ `head -c$TESTCHARS "$fichier"` = "$SHABANG" ]] # head -c2 #! # L'opton '-c' de "head" n'affiche que le nombre spécifié de #+ caractères, plutôt que de lignes (par défaut). then echo "Le fichier \"$fichier\" est un script." else echo "Le fichier \"$fichier\" n'est *pas* un script." fi done exit 0 |
Exemple 12-10. Générer des nombres aléatoires de 10 chiffres
#!/bin/bash # rnd.sh: Affiche un nombre aléatoire de 10 chiffres # Script de Stephane Chazelas. head -c4 /dev/urandom | od -N4 -tu4 | sed -ne '1s/.* //p' # =================================================================== # # Analyse # ------- # head: # -c4 prend les 4 premiers octets. # od: # -N4 limite la sortie à 4 octets. # -tu4 sélectionne le format de sortie décimal non-signé. # sed: # -n , combiné avec le drapeau "p" de la commande "s", # n'affiche que les lignes correspondantes. # L'auteur explique ci-après le fonctionnement de 'sed'. # head -c4 /dev/urandom | od -N4 -tu4 | sed -ne '1s/.* //p' # ----------------------------------> | # On dit que ce que l'on va --------> | # envoyer à "sed" ------------------> | # est 0000000 1198195154\n ---------> | # sed commence par lire les caractères: 0000000 1198195154\n. # Ici, il trouve un caractère de saut de ligne, # donc il est prêt pour commencer à s'occuper de la première ligne (0000000 1198195154). # Il regarde son <intervalle><action>s. La première est # intervalle action # 1 s/.* //p # The line number is in the range, so it executes the action: # tries to substitute the longest string ending with a space in the line # ("0000000 ") with nothing (//), and if it succeeds, prints the result # ("p" is a flag to the "s" command here, this is different from the "p" command). # sed is now ready to continue reading its input. (Note that before # continuing, if -n option had not been passed, sed would have printed # the line once again). # Now, sed reads the remainder of the characters, and finds the end of the file. # It is now ready to process its 2nd line (which is also numbered '$' as # it's the last one). # It sees it is not matched by any <range>, so its job is done. # In few word this sed commmand means: # "On the first line only, remove any character up to the right-most space, # then print it." # A better way to do this would have been: # sed -e 's/.* //;q' # Here, two <range><action>s (could have been written # sed -e 's/.* //' -e q): # range action # nothing (matches line) s/.* // # nothing (matches line) q (quit) # Here, sed only reads its first line of input. # It performs both actions, and prints the line (substituted) before quitting # (because of the "q" action) since the "-n" option is not passed. # =================================================================== # # A simpler altenative to the above 1-line script would be: # head -c4 /dev/urandom| od -An -tu4 exit 0 |
Affiche la fin d'un fichier vers stdout (par défaut 10 lignes). Habituellement utilisé pour voir les changements faits à un fichier de traces avec -f qui affiche les lignes ajoutées à un fichier.
Exemple 12-11. Utiliser tail pour surveiller le fichier des traces système
#!/bin/bash fichier=sys.log cat /dev/null > $fichier; echo "Crée / efface fichier." # Crée ce fichier s'il n'existait pas auparavant, #+ et le réduit à une taille nulle s'il existait. # : > fichier et > fichier marchent aussik. tail /var/log/messages > $fichier # /var/log/messages doit avoir la permission de lecture pour que ce programme #+ marche. echo "$fichier contient la fin du fichier log système." exit 0 |
Voir aussi Exemple 12-4, Exemple 12-30 et Exemple 30-6.
Un outil de recherche qui utilise les expressions régulières. A la base, c'était un filtre du vénérable ed éditeur de ligne, G.Re.P : global - regular expression - print.
grep motif [fichier...]
Recherche dans le fichier cible un motif, où motif peut être un texte littéral ou une expression régulière.
bash$ grep '[rst]ystem.$' osinfo.txt The GPL governs the distribution of the Linux operating system. |
Si aucun fichier n'est spécifié, grep travaillera en tant que filtre sur stdout, comme dans un tube.
bash$ ps ax | grep clock 765 tty1 S 0:00 xclock 901 pts/1 S 0:00 grep clock |
-i active la recherche insensible à la casse.
-w recherche seulement les mots entiers.
-l liste seulement les fichiers dans lesquels des correspondances ont été trouvées, mais pas les lignes correspondantes.
-r (récursif) cherche dans tous les sous-répertoires.
-n montre en plus les numéros de lignes qui correspondent.
bash$ grep -n Linux osinfo.txt 2:This is a file containing information about Linux. 6:The GPL governs the distribution of the Linux operating system. |
-v (ou --invert-match) n'affiche pas les correspondances, seulement celles qui ne correspondent pas.
grep motif1 *.txt | grep -v motif2 # Recherche dans "*.txt" de "motif1", # mais ***pas*** "modif2". |
-c (--count) affiche le nombre de correspondances trouvées, plutôt que de les afficher.
grep -c txt *.sgml # (nombre d'occurences de "txt" dans les fichiers "*.sgml") # grep -cz . # ^ point # signifie compter (-c) les objets séparés par des zéros (-z) correspondant à "." # c'est à dire, ceux qui ne sont pas vides (contenant au moins 1 caractère). # printf 'a b\nc d\n\n\n\n\n\000\n\000e\000\000\nf' | grep -cz . # 4 printf 'a b\nc d\n\n\n\n\n\000\n\000e\000\000\nf' | grep -cz '$' # 5 printf 'a b\nc d\n\n\n\n\n\000\n\000e\000\000\nf' | grep -cz '^' # 5 # printf 'a b\nc d\n\n\n\n\n\000\n\000e\000\000\nf' | grep -c '$' # 9 # Par défaut, les caractères de fin de ligne (\n) séparent les objets à rechercher. # Notez que -z est spécifique à GNU "grep" # Merci, S.C. |
Lorsqu'il est invoqué avec plus d'un fichier cible donné, grep spécifie quel fichier contient les correspondances.
bash$ grep Linux osinfo.txt misc.txt osinfo.txt:This is a file containing information about Linux. osinfo.txt:The GPL governs the distribution of the Linux operating system. misc.txt:The Linux operating system is steadily gaining in popularity. |
![]() | Pour forcer grep à montrer le nom du fichier pendant la recherche d'un fichier cible, donnez /dev/null comme deuxième fichier.
|
S'il y a une correspondance trouvée, grep retourne un code de sortie de 0, ce qui le rend utile comme test conditionnel dans un script, en particulier en combinaison avec l'option -q pour supprimer la sortie.
SUCCES=0 # si la recherche avec grep est fructueuse mot=Linux nomfichier=donnees.fichier grep -q "$mot" "$nomfichier" # -q supprime l'affichage vers stdout if [ $? -eq $SUCCES ] then echo "$mot trouvé dans $nomfichier" else echo "$mot introuvable dans $nomfichier" fi |
L'Exemple 30-6 démontre comment utiliser grep pour chercher un mot dans un fichier de traces.
Exemple 12-12. Emuler << grep >> dans un script
#!/bin/bash # grp.sh: Une réimplémentation brute de 'grep'. E_MAUVAISARGS=65 if [ -z "$1" ] # Vérification standard des arguments de ligne de commande. then echo "Usage: `basename $0` motif" exit $E_MAUVAISARGS fi echo for fichier in * # Parcourt tous les fichiers dans $PWD. do sortie=$(sed -n /"$1"/p $fichier) # Substitution de commande. if [ ! -z "$sortie" ] # Que se passe t-il si "$sortie" n'est pas quotés ? then echo -n "$fichier: " echo $sortie fi # sed -ne "/$1/s|^|${fichier}: |p" est l'équivalent de dessus. echo done echo exit 0 # Exercices: # --------- # 1) Ajoutez des sauts de lignes à la sortie, # s'il y a plus d'une correspondance dans n'importe quel fichier donné. # 2) Ajoutez des nouvelles possibilités. |
![]() | egrep est comme grep -E. Elle utilise un jeu d'expressions régulières légèrement différent et étendu, ce qui peut rendre une recherche plus flexible. fgrep est comme grep -F. Elle recherche une chaîne littérale (pas d'expressions régulières), ce qui accélère les choses. agrep étend les possibilités de grep à une recherche approximative. La chaîne peut différer d'un nombre spécifié de caractères des résultats de recherches. Cette commande ne fait pas partie des distributions Linux. |
![]() | Pour chercher dans des fichiers compressés, utilisez zgrep, zegrep ou zfgrep. Ces commandes marchent aussi avec des fichiers non compressés, bien que plus lentement qu'un simple grep, egrep, fgrep. C'est pratique pour chercher dans divers fichiers, compressés ou non. Pour chercher dans des fichiers compressés avec bzip, utilisez bzgrep. |
La commande look fonctionne comme grep mais fait une recherche basée sur un << dictionnaire >>, une liste de mots triés. Par défaut, look cherche une correspondance dans /usr/dict/words mais un autre dictionnaire peut être utilisé.
Exemple 12-13. Chercher les mots dans une liste pour tester leur validité
#!/bin/bash # lookup: Fait une recherche basée sur un dictionnaire sur chaque mot d'un #+ fichier de données. fichier=mots.donnees # Le fichier de données a partir duquel on lit les mots à #+ tester. echo while [ "$mot" != end ] # Le dernier mot du fichier de données. do read mot # Depuis le fichier de données, à cause de la redirection à la #+ fin de la boucle. look $mot > /dev/null # Nous ne voulons pas afficher les lignes dans le #+ dictionnaire. lookup=$? # Code de sortie de 'look'. if [ "$lookup" -eq 0 ] then echo "\"$mot\" est valide." else echo "\"$mot\" est invalide." fi done <"$fichier" # Redirige stdin vers $fichier, donc les "lectures" #+ commencent à partir d'ici. echo exit 0 # ----------------------------------------------------------------------------- # Le code ci-dessous ne s'exécutera pas au cause de la commande exit au dessus # Stephane Chazelas propose aussi ce qui suit, une alternative plus concise : while read mot && [[ $mot != end ]] do if look "$mot" > /dev/null then echo "\"$mot\" est valide." else echo "\"$mot\" est invalide." fi done <"$fichier" exit 0 |
Langages de script créés spécialement pour analyser les fichiers texte et les sorties de commandes. Peuvent être intégrés seuls ou emsembles dans des tubes et des scripts shell.
<< Editeur de flux >> non interactif, permettant d'utiliser plusieurs commandes ex dans un mode batch. C'est souvent utile dans des scripts shell.
Extracteur et formatteur de fichiers programmables, bon pour la manipulation ou l'extraction de champ (colonnes) dans des fichiers textes structurés. Sa syntaxe est similaire à C.
wc (word count) donne le nombre de mots d'un fichier ou d'un flux:
bash $ wc /usr/doc/sed-3.02/README 20 127 838 /usr/doc/sed-3.02/README [20 lignes 127 mots 838 caractère] |
wc -w donne seulement le nombre de mots.
wc -l donne seulement le nombre de lignes.
wc -c donne le nombre de caractères.
wc -L donne la taille de la ligne la plus longue.
Utiliser wc pour connaître le nombre de fichiers .txt dans le répertoire courant :
$ ls *.txt | wc -l # Cela ne fonctionnera que si aucun fichier "*.txt" ont un saut de ligne dans #+ leur noms. # D'autres moyens de faire ça: # find . -maxdepth 1 -name \*.txt -print0 | grep -cz . # (shopt -s nullglob; set -- *.txt; echo $#) # Merci, S.C. |
Utiliser wc pour compter la taille de tous les fichiers dont le nom commence avec les lettres d à h
bash$ wc [d-h]* | grep total | awk '{print $3}' 71832 |
Utiliser wc pour compter le nombre de fois que << Linux >> apparaît dans ce document.
bash$ grep Linux abs-book.sgml | wc -l 50 |
Voir aussi Exemple 12-30 et Exemple 16-7.
Certaines commandes incluent quelques fonctionnalité de wc comme options.
... | grep foo | wc -l # Cette construction fréquemment utilisée peut être plus concise. ... | grep -c foo # Utiliser l'option "-c" (or "--count") de grep à la place. # Merci, S.C. |
Filtre de traduction de caractères.
![]() | Utilisez les guillemets et/ou les parenthèses, si besoin est. Les guillemets empêchent le shell de réinterpréter les caractères spéciaux dans les séquences de commande de tr. Les parenthèses devraient être mises entre guillemets pour empêcher leur expansion par le shell. |
tr "A-Z" "*" < fichier ou tr A-Z \* < fichier remplacent toutes les majuscules de fichier par des astérisques (le résultat est écrit dans stdout). Sur certains systèmes, ça peut ne pas fonctionner. Cependant tr A-Z '[**]' fonctionnera.
-d efface un intervalle de caractères.
echo "abcdef" # abcdef echo "abcdef" | tr -d b-d # aef tr -d 0-9 < fichierbidon # Efface tous les chiffres du fichier "fichierbidon". |
--squeeze-repeats (ou -s) efface tout sauf la première occurence d'une chaîne de caractères. Cette option est utile pour supprimer les espaces blancs superflus.
bash$ echo "XXXXX" | tr --squeeze-repeats 'X' X |
-c << complement >> inverse l'ensemble des caractères à détecter. Avec cette option, tr n'agit que sur les caractères ne faisant pas parti de l'ensemble spécifiés.
bash$ echo "acfdeb123" | tr -c b-d + +c+d+b++++ |
Notez que tr reconnait les ensembles de caractères POSIX. [1]
bash$ echo "abcd2ef1" | tr '[:alpha:]' - ----2--1 |
Exemple 12-14. toupper: Transforme un fichier en majuscule.
#!/bin/bash # Met unemajuscule un fichier E_MAUVAISARGS=65 if [ -z "$1" ] # Vérification standard des arguments de ligne de commande. then echo "Usage: `basename $0` nomfichier" exit $E_MAUVAISARGS fi tr a-z A-Z <"$1" # Même effet que le programme au dessus, mais utilisant la notation POSIX : # tr '[:lower:]' '[:upper:]' <"$1" # Merci, S.C. exit 0 |
Exemple 12-15. lowercase: Change tous les noms de fichier du répertoire courant en minuscule.
#! /bin/bash # # Change chaque nom de fichier en minuscules dans le répertoire courant. # # Inspiré par un script de John Dubois, # qui fut traduit en Bash par Chet Ramey, # et considérablement simplifié par Mendel Cooper, auteur de ce document. for nomfichier in * # Scanne tous les fichiers du répertoire. do nomF=`basename $nomfichier` n=`echo $nomF | tr A-Z a-z` # Change le nom en minuscule. if [ "$nomF" != "$n" ] # Renomme seulement les fichiers qui ne sont #+ pas en minuscules. then mv $nomF $n fi done exit 0 # Le code en dessous ne s'exécutera pas à cause de la commande exit au dessus #-----------------------------------------------------------------------------# # Pour le lancer, effacez la ligne de script ci dessus. # Le script suivant ne fonctionnera pas sur les fichiers dont le nom a des #+ espaces ou des caractères de saut de ligne. # Stephane Chazelas suggère donc l'alternative suivante : for nomfichier in * # Pas nécéssaire d'utiliser basename, # car "*" ne retourne aucun fichier contenant "/". do n=`echo "$nomfichier/" | tr '[:upper:]' '[:lower:]'` # Jeu de notation POSIX. # Le slash est ajouté, comme ça les saut de lignes ne sont # pas supprimés par la substition de commande. # Substitution de variable : n=${n%/} # Supprime le slash de fin, rajouté au dessus, du nom de #+ fichier. [[ $nomfichier == $n ]] || mv "$nomfichier" "$n" # Vérifie si le nom de fichier est déjà en minuscules. done exit 0 |
Exemple 12-16. du: Converti les fichiers text DOS vers UNIX.
#!/bin/bash # du.sh: Convertisseur de fichier texte DOS vers UNIX. E_WRONGARGS=65 if [ -z "$1" ] then echo "Usage: `basename $0` fichier-a-convertir" exit $E_WRONGARGS fi NEWFILENAME=$1.unx CR='\015' # Retour charriot. # En DOS, les lignes se termine par un CR-LF. tr -d $CR < $1 > $NEWFILENAME # Efface les caractères CR et écrit le résultat dans un nouveau fichier. echo "Le fichier texte DOS original est \"$1\"." echo "Le fichier UNIX converti est \"$NEWFILENAME\"." exit 0 |
Exemple 12-17. rot13: rot13, cryptage ultra-faible.
#!/bin/bash # rot13.sh: L'algorithme classique rot13, # cryptage qui pourrait berner un gamin de 3 ans. # Usage: ./rot13.sh nomfichier # ou ./rot13.sh <nomfichier # ou ./rot13.sh et fournissez une entrée clavier (stdin) cat "$@" | tr 'a-zA-Z' 'n-za-mN-ZA-M' # "a" devient "n", "b" devient "o", etc. # La commande 'cat "$@"' #+ permet la saisie de données depuis soit stdin soit un fichier. exit 0 |
Exemple 12-18. Générer des puzzles << Crypto-Citations >>
#!/bin/bash # crypto-quote.sh: Crypte les citations # Crypte de célèbre citations par une simple substitution de lettres. # Le résultat est similaire aux puzzles "Crypto Quote" #+ vus sur les pages "Op Ed" du journal Sunday. key=ETAOINSHRDLUBCFGJMQPVWZYXK # "key" n'est qu'un alphabet mélangé. # Changer "key" modifie le cryptage. # L'instruction 'cat "$@"' prend son entrée soit de stdin, soit de fichiers. # Si stdin est utilisé, il faut terminer la saisie par un Ctrl-D. # Sinon, spécifier le nom du fichier en tant que paramètre de la ligne de commande. cat "$@" | tr "a-z" "A-Z" | tr "A-Z" "$key" # | en majuscule | crypte # Fonctionne avec n'importe quel type de casse : majuscule, minuscule ou les #+ deux ensemble. # Les caractères non-alphabétiques restent inchangés. # Essayer ce script avec # "Nothing so needs reforming as other people's habits." # --Mark Twain # # Il en résulte : # "CFPHRCS QF CIIOQ MINFMBRCS EQ FPHIM GIFGUI'Q HETRPQ." # --BEML PZERC # Pour décrypter, utiliser : # cat "$@" | tr "$key" "A-Z" # Ce programme de cryptage bidon peut être cassé par un gosse de 12 ans. exit 0 |
Un filtre qui coupe les lignes entrées à partir d'une taille spécifiée. C'est spécialement utile avec l'option -s, qui coupe les lignes à chaque espace (voir Exemple 12-19 et Exemple A-2).
Un formatteur de fichier tout bête, utilisé en tant que filtre dans un tube pour << couper >> les longues lignes d'un texte.
Exemple 12-19. Affichage d'un fichier formatté.
#!/bin/bash LARGEUR=40 # Colonnes de 40 caractères. b=`ls /usr/local/bin` # Récupère la liste des fichiers du répertoire echo $b | fmt -w $LARGEUR # Aurait pu aussi être fait avec # echo $b | fold - -s -w $LARGEUR exit 0 |
Voir aussi Exemple 12-4.
![]() | Une puissante alternative à fmt est par de Kamil Toman disponible sur http://www.cs.berkeley.edu/~amc/Par/. |
Cette commande dont le nom est trompeur supprime les retours chariot inversés d'un flux en entrée. Elle tente aussi de remplacer les espaces blances par des tabulations équivalentes. Le rôle principal de col est de filtrer la sortie de certains utilitaires de manipulation de textes, tels que groff et tbl.
Formatteur de colonnes. Ce filtre transforme le texte écrit façon "liste" en un << joli >> tableau par l'insertion de tabulations aux endroits appropriés.
Exemple 12-20. utiliser column pour formatter l'affichage des répertoires
#!/bin/bash # Il s'agit d'une légère modification du fichier d'exemple dans la page de #+ manuel de "column". (printf "PERMISSIONS LIENS PROPRIETAIRE GROUPE TAILLE MOIS JOUR HH:MM NOM-PROG\n" \ ; ls -l | sed 1d) | column -t # "sed 1d" efface la première ligne écrite, #+ qui devrait être "total N", #+ où "N" est le nombre total de fichiers trouvés par "ls -l". # L'option -t de "column" affiche un tableau bien formaté. exit 0 |
Filtre de suppression de colonnes. Ce filtre enlève les colonnes (caractères) d'un fichier et affche le résultat vers stdout. colrm 2 4 < fichier efface le deuxième par bloc de 4 caractères de chaque ligne du fichier fichier.
![]() | Si le fichier contient des tabulations ou des caractères non imprimables, ça peut causer des comportements imprévisibles. Dans de tel cas, considérez l'utilisation de expand et unexpand dans un tube précédant colrm. |
Filtre de numérotation de lignes. nl fichier affiche fichier sur stdout en insérant un nombre au début de chaque ligne non vide. Si fichier est omit, alors ce filtre travaillera sur stdin.
La sortie de nl est très similaire à cat -n. Cependant, par défaut nl ne liste pas les lignes vides.
Exemple 12-21. nl: Un script d'autonumérotation.
#!/bin/bash # Ce script s'affiche deux fois sur stdout en numérotant les lignes. # 'nl' voit ceci comme la ligne 3 car il ne compte pas les lignes blanches. # 'cat -n' voit la ligne ci-dessus comme étant la ligne 5. nl `basename $0` echo; echo # Maintenant, essayons avec 'cat -n' cat -n `basename $0` # La différence est que 'cat -n' numérote les lignes blanches. # Notez que 'nl -ba' fera de même. exit 0 |
Filtre d'impression formatté. Ce filtre paginera des fichiers (ou stdout) en sections utilisables pour des impressions papier ou pour voir à l'écran. Diverses options permettent la manipulation des rangées et des colonnes, le regroupement des lignes, la définition des marges, la numérotation des lignes, l'ajout d'entêtes par page et la fusion de fichiers entre autres choses. La commande pr combine beaucoup des fonctionnalités de nl, paste, fold, column et expand.
pr -o 5 --width=65 fileZZZ | more renvoie un joli affichage paginé à l'écran de fileZZZ avec des marges définies à 5 et 65.
Une option particulèrement utile est -d, forçant le double-espacement (même effet que sed -G).
Un utilitaire GNU pour localiser et traduire les sorties textes des programmes en langue étrangère. Bien que prévu à l'origine pour les programmes C, gettext trouve aussi son utilité dans des scripts shell. Voir la page info.
Un utilitaire pour convertir des fichiers en un codage différent (jeu de caractère). Son rôle principal concerne les localisations.
Considérez-le comment une version fantaisie d'iconv, ci-dessus. Ce très souple utilitaire pour la conversion d'un fichier dans un jeu de caractère différent ne fait pas partie d'une installation Linux standard.
TeX et Postscript sont des langages de balises utilisés pour préparer une impression ou un formattage pour l'affichage vidéo.
TeX est le système "typesetting" élaboré de Donald Knuth. C'est souvent pratique d'écrire un script qui va encapsuler toutes les options et arguments passés à l'un de ces langages.
Ghostscript (gs) est un interpréteur GPL de Postscript .
Un autre langage de balises est groff. C'est la version avancée GNU de la commande UNIX roff/troff. Les pages de manuel utilisent groff (voir Exemple A-1).
tbl, utilitaire de création de tableau est considéré comme faisant partie de groff, dans la mesure où sa fonction est de convertir une balise tableau en commandes groff.
Le processeur d'équations eqn fait aussi parti de groff et sa fonction est de convertir une balise d'équation en commandes groff.
lex, analyseur lexical, produit des programmes pour la détection de motifs. Ca a été remplacé depuis par le non propriétaire flex sur les systèmes Linux.
L'utilitaire yacc crée un analyseur basé sur un ensemble de spécifications. Elle est depuis remplacée par le non propriétaire bison sur les systèmes Linux.
[1] | Ce n'est vrai que pour la version GNU de tr, pas pour les versions se trouvant dans les systèmes UNIX commerciaux. |
Précédent | Sommaire | Suivant |
Commandes de date et d'heure | Niveau supérieur | Commandes pour les fichiers et l'archivage |