Logo Khaganat

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
Prochaine révisionLes deux révisions suivantes
fr:bestpractices [2018/03/28 17:06] – /* awk */ merlin8282fr:bestpractices [2018/03/28 17:36] – /* exemple find */ merlin8282
Ligne 154: Ligne 154:
   19 20 21 22 23 24 25     19 20 21 22 23 24 25  
   26 27 28 29 30 31   26 27 28 29 30 31
 +  
   $ cal dec 9999   $ cal dec 9999
      December 9999            December 9999      
Ligne 195: Ligne 196:
  
 ==== awk ==== ==== awk ====
-''awk'' est plus qu'une "simple" commande, c'est un langage de programmation permettant notamment de manipuler des chaînes de caractères. Voici quelques exemples, qui sont loin d'être exhaustifs quant à ce qu'il est possible de faire avec awk. Cela dit, ils donneront déjà un petit aperçu.+''awk'' est plus qu'une "simple" commande, c'est un langage de programmation permettant notamment de manipuler des chaînes de caractères. Ici nous n'allons voir que des exemples en ligne de commande, bien qu'il soit tout à fait possible d'écrire des programmes plus gros en awk, à la même manière que les scripts shell. Couramment ces petits "mini-programmes" en ligne de commandes sont appelés des ''oneliners'', du fait qu'ils tiennent sur une seule ligne. 
 + 
 +Voici quelques exemples, qui sont loin d'être exhaustifs quant à ce qu'il est possible de faire avec awk. Cela dit, ils donneront déjà un petit aperçu.
  
   $ sentence="year-month-day hours:minutes:seconds :ms \"this is a comment\""   $ sentence="year-month-day hours:minutes:seconds :ms \"this is a comment\""
   $ printf "%s\n" "$sentence" | awk '{print $1}'   $ printf "%s\n" "$sentence" | awk '{print $1}'
 +  year-month-day
  
 Cela affiche le premier élément de la phrase, les éléments étant (par défaut) les chaînes de caractères séparées par une espace. Cela affiche le premier élément de la phrase, les éléments étant (par défaut) les chaînes de caractères séparées par une espace.
Ligne 238: Ligne 242:
  
 Cela revient au final à la même chose que ci-dessus, étant donné que l'on n'a qu'un seul élément par ligne. Cela revient au final à la même chose que ci-dessus, étant donné que l'on n'a qu'un seul élément par ligne.
 +
 +  $ printf "%s\n" "$lines" | awk '/line/ {print $0}'
 +  line1
 +  line2
 +  line3
 +
 +On matche ''line'', donc toutes les trois lignes sont affichées.
  
   $ printf "%s\n" "$lines" | awk '/e3/ {print $0}'   $ printf "%s\n" "$lines" | awk '/e3/ {print $0}'
Ligne 248: Ligne 259:
 ===== Options peu utilisées/connues ===== ===== Options peu utilisées/connues =====
 ==== find ==== ==== find ====
-Pour supprimer des fichiers de manière automatisée on pourrait être tenté d'exécuter ce genre de commande : 
  
-  rm -rf `find /var/tmp/ -type -name .svn`+  find /var/ -mount -maxdepth 1 -type f -exec ls -lh {} \;
  
-Cette commande cherche tous les dossiers nommés ''.svn'' dans /var/tmp/ de manière récursivepuis passe le résultat à la commande ''rm -rf''. Le problème qui peut se poser est si dans cette liste de dossiers, l'un d'eux contient une espace dans son cheminla commande va échouer et donc ce dossier ne sera pas supprimé.+La commande ''find'' a beaucoup d'options. Ici on en utilise quelques unes, en l'occurrence -mount, qui ne cherche que dans le système de fichiers contenant ou étant monté sur ''/var''. L'option -mount sera utilisée par souci de compatibilité avec les anciennes versions de ''find''sinon on lui préférera le nom ''-xdev''qui est exactement la même option. 
 + 
 +''-maxdepth 1'' indique de ne chercher que dans le sous-dossier direct. On peut indiquer la profondeur de recherche en augmentant la valeur. 
 + 
 +''-type f'' : le type de fichier que l'on cherche ; 'f' pour un fichier, 'd' pour un dossier'l' pour un lien symbolique, etc. 
 + 
 +Enfin ''-exec'' indique une commande à effectuer pour chaque fichier trouvé (représenté par ''{}''). La fin de cette commande est indiquée par ''\;''. Le point-virgule est échappé par une contre-oblique sinon il est interprété par le shell. 
 +Il est possible de mettre le signe '+' à la place de ''\;'', ce qui aura pour effet de ne pas lancer la commande pour chaque fichier trouvé, mais de ne la lancer qu'une seule fois, avec une liste de tous les fichiers en paramètre.
  
-Pour bien faire les choses, autant dire directement à la commande ''find'' de supprimer les dossiers trouvés, via l'option ''-exec'' : 
  
-  find /var/tmp/ -type d -name .svn -exec rm -rf {} \; 
 ==== grep / wc ==== ==== grep / wc ====
 On voit très très souvent des oneliners qui, pour compter le nombre de lignes font ceci : On voit très très souvent des oneliners qui, pour compter le nombre de lignes font ceci :
Ligne 294: Ligne 309:
  
 Cela n'est qu'un exemple. À chaque modification il faut se poser la question : "Est-ce que ma modification est «reboot-proof» ?" Cela n'est qu'un exemple. À chaque modification il faut se poser la question : "Est-ce que ma modification est «reboot-proof» ?"
 +
 +
 +==== find ====
 +Pour supprimer des fichiers de manière automatisée on pourrait être tenté d'exécuter ce genre de commande :
 +
 +  rm -rf `find /var/tmp/ -type d -name .svn`
 +
 +Cette commande cherche tous les dossiers nommés ''.svn'' dans /var/tmp/ de manière récursive, puis passe le résultat à la commande ''rm -rf''. Le problème qui peut se poser est si dans cette liste de dossiers, l'un d'eux contient une espace dans son chemin, la commande va échouer et donc ce dossier ne sera pas supprimé.
 +
 +Pour bien faire les choses, autant dire directement à la commande ''find'' de supprimer les dossiers trouvés, via l'option ''-exec'' :
 +
 +  find /var/tmp/ -type d -name .svn -exec rm -rf {} \;
  
  
 {{tag>Tag_a_ajouter}} {{tag>Tag_a_ajouter}}
CC Attribution-Share Alike 4.0 International Driven by DokuWiki
fr/bestpractices.txt · Dernière modification : 2021/12/03 19:19 de 127.0.0.1

Licences Mentions légales Accueil du site Contact