19
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

csplitでキーワードでファイルを分割する

csplitでキーワードでファイルを分割する

いきなりだけど、詳細はこの辺見るといいと思う。とても詳しい。
http://takuya-1st.hatenablog.jp/entry/20110823/1314108412

こんな時

  • 本番DBのバックアップ取って来たけどなんか大量にDATABASEがあってファイルが超でかい。
  • 必要なところだけ抜き出したいけど、サイズがGB単位なのでとてもじゃないけどvimとかemacsなんかじゃ開けない。

たとえば

mysqldumpの場合、

bash
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で区切ってやるといい。

bash
csplit dump.sql /CREATE\ DATABASE/ {*}

{*} は全てのマッチ部分で分割する指定。

xx00
xx01
xx02
xx03

こんな感じで順番に出力される。

区切りに指定したキーワードは、 キーワードのマッチした次のファイル に入るので、
この場合、xx00はヘッダコメントとかの必要ない部分。
xx01から順番に、dumpしたファイルの先頭からDATABASE単位で分割されてる。

それでもまだファイルがでかい場合、単体DATABASEファイルをさらにテーブル単位で分割したりしたらよいと思う。

bash
csplit --prefix=table_ xx01 /DROP\ TABLE\ IF\ EXISTS/ {*}

とか

bash
csplit --prefix=table_ xx01 /CREATE\ TABLE/ {*}

みたいな感じで。

macの人

bsdのcsplitは残念なので、brewでgnu coreutils入れてgcsplit使うといい。

余談

less だと全部一気にメモリに読み込まないので、でかいファイル開いても固まったりしない。
どんなキーワードで分割するかとか、ちょっと中身確認するのにはless使うといい。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
19
Help us understand the problem. What are the problem?