[gull] Truc et astuces: Jouons avec `sed`

felix felix at f-hauri.ch
Wed Feb 5 13:52:22 CET 2014


Bonjour,

J'aime bien sed, car il fait partie de `coreutils` et est présent
dans toutes les machines plus ou moins "POSIX".

Voici donc quelques astuces a propos de sed:

 - recherches des nom de répertoires
    Où il est question de trouver des chaines qui terminent par un ``/'' ou
    qui teminent la ligne:

        $ sed -ne '/\/path\/au\/slash\/echappe\($\|\/\)/p'
    ou  $ set -ne '/\/path\/au\/slash\/echappe\(\/\|$\)/p'

    En utilisant l'argument `-r` l'échapement des parenthèse est inversé:

        $ sed -rne '/\/path\/au\/slash\/echappe(\/|$)/p'

    et cela devient un peu plus lisible...

    Mais la réflexion peut être posée différement! où:
    Il y sera question de trouver les lignes qui terminent par le nom
    du dossier ou le nom du dossier suivit de / qqqch:

        $ sed -ne  '/\/path\/au\/slash\/echappe\(\|\/.*\)$/p'
    ou  $ sed -rne '/\/path\/au\/slash\/echappe(|\/.*)$/p'

 - Extraction d'*une* table, d'*une* database d'un `mysql_dump_all`...

   Soit un dump de mysql qui contient plusieurs centaines de databases
   qui contiennent beaucoup de tables au nom identique.

   Par ex: un hegergeur WEB host plusieur DB par client. Parmi les clients
   bcp installeront du wordpress, joomla ou autre cms, utilisant une
   structure de db identique...

   Le but est de ne ressortir que le *contenu de la* table `xxx`, de
   *la* database `yyy`.

   Le fichier mysql_dump.gz pèse 7Gb! La commande `gunzip -l` indique
   que le fichier décompressé pèse 21Gb!! (Je dispose de 4Gb de RAM;-)

   Voici comment j'ai fait.

   $ dbname=yyy tblname=xxx

   $ zcat mysql_dump.gz |
       sed -ne '/^-- Current Database: `'$dbname'`$/,/^-- Current Database/{
                  /^-- Current Database/{
                      /'$dbname'/!q
                  };
                  /^-- Dumping data for table `'$tblname'`$/,/^--$/{
                      //{N;P;d};
                      p;
                  }
                }' |
       gzip >$outfile.gz

   fun!

 - Petit exercice de style:
   Le but était de totaliser les lignes par champ:

    A 8
    B 3
    A 2
    B 4

   pour obtenir:

    A 10
    B 7

   ... en utilisant `sed` (au lieu de `sort`)

   $ echo $'A 8\nB 3\nA 2\nB 4' |
     sed -ne '
       x;      # swap crt line and hold space
       G;      # append hold space to crt line
       /\(.\)=.*\n\1/ ! s/^\(.*\)\n\(.\) \(.*\)$/\1 \2=\3 /; # if not find, append
       s/\(.\)=\(.*\)\n\1 \(.*\)/\1=\3+\2/; # add `+` + crt value at right place
       x;      # swap crt line and hold space
       ${   # on last line
         x;    # swap crt line and hold space
         p     # print
       }'

    A=2+8  B=4+3 

Ce sera tout pour aujourd'hui.

--
  Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch



More information about the gull mailing list