csplit の使い方
csplit ファイル名 区切り文字
二つに分割されます.
csplit は 文字を見つけて,見つかった場所で切断します.
見つかった文字は次のファイルに書かれます.区切り文字で巨大なファイルをぶった切るととても便利です.
見つかる限り分割したい
区切り文字が見つかる度に分割したい.すべて
csplit ファイル名 区切り文字 {*}
逆に10個目で分割を止めたい
指定回数分割したらそこで一端辞める
csplit ファイル名 区切り文字 {10}
10ファイルで止まります.
数字の書式を変えたい
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個になってもそんなにたいへんじゃないと思うんですけどね。