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使うといい。