業務で必要になってスクリプトを書いたのでメモ。
条件
DB(mysql)のバックアップファイルはzipで、中身はdropとcreateのあとにデータを複数行まとめてinsertしている。このzipファイルが日付ごとに大量にある。
※ほんとにやりたかったことは、DBのデータがどこで変わったかを大量のバックアップファイルから追うこと。
スクリプト
特定文字列でgrepするだけだと、insertの後ろ全てが取れてくるので、「),(」を改行コードに置換してからgrepすることにした。
※insertの先頭と最後はきれいにレコード取れないけどそれぐらいは良しにした。
grepを二回かけているのは、いきなり置換するより対象のinsert分抽出してからの方が早いから。
特定文字列を含んだレコードとファイル名を結果ファイル(out.txt)へ出力する。
bash
target=hogehoge
LF=$(printf '\\\012_')
LF=${LF%_}
for file in `ls *.zip`;do
echo $file >> out.txt
zcat $file | grep $target | sed 's/),(/'"$LF"'/g' | grep $target >> out.txt
done