それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

csplitコマンド の使い方 csplit は区切り単語でファイル分割

csplit の使い方

csplit ファイル名 区切り文字

二つに分割されます.

csplit は 文字を見つけて,見つかった場所で切断します.
見つかった文字は次のファイルに書かれます.区切り文字で巨大なファイルをぶった切るととても便利です.

見つかる限り分割したい

区切り文字が見つかる度に分割したい.すべて

csplit ファイル名 区切り文字 {*}

逆に10個目で分割を止めたい

指定回数分割したらそこで一端辞める

csplit ファイル名 区切り文字 {10}

10ファイルで止まります.

正規表現で分割したい

正規表現も使える

csplit ファイル名 /^マーカー.+$/ {*}

数字の書式を変えたい

default では %02d です。つまり0埋です

csplit --suffix=%05d ファイル名 /^マーカー.+$/ {*}

5桁を0で埋めます xx00001 xx00002 xx00003...

xxを辞めたい

ファイル名の先頭を自由につける

csplit --prefix=fin  ファイル名 /^マーカー.+$/ {*}

fin01 fin02 fin03

実践編:SSHのlogを切ってみる

Aug 23 17:35:30 web2 sshd[3806]: reverse mapping checking getaddrinfo for pcXXXXXX.ac.jp [1XXXXX] failed - POSSIBLE BREAK-IN ATTEMPT!
Aug 23 17:35:30 web2 sshd[3806]: Deprecated pam_stack module called from service "sshd"
Aug 23 17:35:30 web2 sshd[3806]: Deprecated pam_stack module called from service "sshd"
Aug 23 17:35:30 web2 sshd[3806]: Accepted password for myadmin from 192.XXX.xxx.34 port 64661 ssh2
Aug 23 17:35:30 web2 sshd[3806]: Deprecated pam_stack module called from service "sshd"
Aug 23 17:35:30 web2 sshd[3806]: Deprecated pam_stack module called from service "sshd"
Aug 23 17:35:30 web2 sshd[3806]: pam_unix(sshd:session): session opened for user myadmin by (uid=0)
Aug 23 17:35:30 web2 sshd[3808]: Deprecated pam_stack module called from service "sshd"
Aug 23 17:35:30 web2 sshd[3808]: subsystem request for sftp by user myadmin
Aug 23 22:43:09 web2 sshd[4391]: reverse mapping checking getaddrinfo for pc192XXXXXcu.ac.jp [192.1XXXX] failed - POSSIBLE BREAK-IN ATTEMPT!
Aug 23 22:43:09 web2 sshd[4391]: Deprecated pam_stack module called from service "sshd"
Aug 23 22:43:09 web2 sshd[4391]: Accepted publickey for myadmin from 192.xxx.xxx.xx port 50439 ssh2
Aug 23 22:43:09 web2 sshd[4391]: Deprecated pam_stack module called from service "sshd"
Aug 23 22:43:09 web2 sshd[4391]: Deprecated pam_stack module called from service "sshd"
Aug 23 22:43:09 web2 sshd[4391]: pam_unix(sshd:session): session opened for user myadmin by (uid=0)
Aug 23 22:43:09 web2 sshd[4393]: Deprecated pam_stack module called from service "sshd"
Aug 23 22:43:17 web2 sudo:   myadmin : TTY=pts/0 ; PWD=/home/myadmin ; USER=root ; COMMAND=/bin/su
Aug 23 22:43:17 web2 su: pam_unix(su:session): session opened for user root by myadmin(uid=0)

ユーザーがアクセする度に,なんどかログが走るので、ログイン単位で切ってみる.

takuya@letsnote:~$ csplit test /ATTEMPT/ {*}
0
849
887

とまぁ、こんな感じで,雑多なログをひとまとめに切り出せます.

便利ですね。

分散処理

hadoop や分散処理にかける前処理でcsplitやっちゃう方がどうせ速いと思うんですけどね.パイプで渡したり.ぶっちゃけ数GBファイル分割するくらいなら、これでやっちゃうのも手です.
ファイルが増えすぎると,出力ファイル数が多くなってls が地獄ですけど・・・

Csplitで2個に分ける処理を繰り返せば,N個になってもそんなにたいへんじゃないと思うんですけどね。