csplitでキーワードでファイルを分割する
いきなりだけど、詳細はこの辺見るといいと思う。とても詳しい。
http://takuya-1st.hatenablog.jp/entry/20110823/1314108412
こんな時
- 本番DBのバックアップ取って来たけどなんか大量にDATABASEがあってファイルが超でかい。
- 必要なところだけ抜き出したいけど、サイズがGB単位なのでとてもじゃないけどvimとかemacsなんかじゃ開けない。
たとえば
mysqldumpの場合、
mysqldump --databases db1 db2 db3 > dump.sql
とか複数DBをまとめてdumpすると、DATABASE同士の区切り(というか次のDATABASE定義の開始位置)は
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db1` /*!40100 DEFAULT CHARACTER SET utf8 */;
みたいになってるので、CREATE DATABASE
で区切ってやるといい。
csplit dump.sql /CREATE\ DATABASE/ {*}
{*}
は全てのマッチ部分で分割する指定。
xx00 xx01 xx02 xx03
こんな感じで順番に出力される。
区切りに指定したキーワードは、 キーワードのマッチした次のファイル に入るので、
この場合、xx00
はヘッダコメントとかの必要ない部分。
xx01
から順番に、dumpしたファイルの先頭からDATABASE単位で分割されてる。
それでもまだファイルがでかい場合、単体DATABASEファイルをさらにテーブル単位で分割したりしたらよいと思う。
csplit --prefix=table_ xx01 /DROP\ TABLE\ IF\ EXISTS/ {*}
とか
csplit --prefix=table_ xx01 /CREATE\ TABLE/ {*}
みたいな感じで。
macの人
bsdのcsplit
は残念なので、brewでgnu coreutils
入れてgcsplit
使うといい。
余談
less
だと全部一気にメモリに読み込まないので、でかいファイル開いても固まったりしない。
どんなキーワードで分割するかとか、ちょっと中身確認するのにはless
使うといい。