[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