LoginSignup
16
19

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-04-25

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

16
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
19