[gull] Truc et astuces: Utiliser ``sed'' pour manipuler un fichier mysqldump
felix
felix at f-hauri.ch
Tue Mar 13 11:16:57 CET 2012
C'est impressionnant les choses que l'on peut faire avec sed!
On utilise souvent une commande du type:
$ mysqldump -A -p | gzip >mysqldump-$(date +%F).gz
pour obtenir un fichier: mysqldump-2012-03-13.gz
Well, voici 8 petites routines qui je l'espère, pourront vous être utiles.
.1 La liste des bases de données peut être obtenue avec:
$ zcat mysqldump-2012-03-13.gz |
sed -ne 's/^-- Current Database: `\(.*\)`/\1/p'
.2 Pour extraire une DB précise, voici une commande qui peut le faire:
$ dbname="mabasededonnees"
$ zcat mysqldump-2012-03-13.gz |
sed -ne '/^-- Current Database: `'$dbname'`$/,/^-- Current Database/{
/^-- Current Database/{/'$dbname'/!q};p}' |
gzip >mysqldump-$dbname-2012-03-13.gz
.3 Pour extraire une table, c'est à peine plus compliqué:
$ dbname="mabasededonnees"
$ tablename="matable"
$ zcat mysqldump-2012-03-13.gz |
sed -ne '/^-- Current Database: `'$dbname'`$/,/^-- Current Database/{
/^-- Current Database/{/'$dbname'/!q};
/^-- Table structure for table `'$tablename'`/,${
/^-- Table structure/{/'$tablename'/!q};
p
};
}'
.4 Du coup, la liste des bases de données *avec* les tables peut être
obtenue avec une commande un poil plus ``recherchée'':
$ zcat mysqldump-2012-03-13.gz |
sed -ne '
/^-- Current Database/{
x;
s/\n/\n\t/g;
/./p;
g;
s/^.*: `\(.*\)`/\1:/;
h
};
/^-- Table struct/{
s/^--.* `\(.*\)`/\1/;
H;
}'
.5 Pour extraire la structure d'une table:
$ dbname="mabasededonnees"
$ tablename="matable"
$ zcat mysqldump-2012-03-13.gz |
sed -ne '/^-- Current Database: `'$dbname'`$/,/^-- Current Database/{
/^-- Current Database/{/'$dbname'/!q};
/^-- Table structure for table `'$tablename'`/,${
1,2{p;d;};
3,/^--$/p;
};
}'
.6 Pour extraire les données d'une table:
$ dbname="mabasededonnees"
$ tablename="matable"
$ zcat mysqldump-2012-03-13.gz |
sed -ne '/^-- Current Database: `'$dbname'`$/,/^-- Current Database/{
/^-- Current Database/{/'$dbname'/!q};
/^-- Dumping data for table `'$tablename'`/,${
1,2{p;d;};
3,/^--$/p;
};
}'
.7 Et pour finir, voici un moyen de rendre le dump a peine plus lisible:
(Je ne garanti pas que le dump peut être ré-injecte comme commande SQL
mais les quelques essais que j'ai fait étaient plutot encourageants)
$ zcat mysqldump-2012-03-13.gz |
sed -e 's/),(/),\n\t(/g;s/VALUES (/VALUES\n\t(/'
.8 Que l'on peut appliquer à la méthode pour extraire les données d'une table:
$ dbname="mabasededonnees"
$ tablename="matable"
$ zcat mysqldump-2012-03-13.gz |
sed -ne '/^-- Current Database: `'$dbname'`$/,/^-- Current Database/{
/^-- Current Database/{/'$dbname'/!q};
/^-- Dumping data for table `'$tablename'`/,${
1,2{p;d;};
3,/^--$/{
s/),(/),\n\t(/g;
s/VALUES (/VALUES\n\t(/;
p
};
};
}'
--
Félix Hauri - <felix at f-hauri.ch> - http://www.f-hauri.ch
More information about the gull
mailing list