[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