AWK万歳

最近の日記でちょっと話題にあがってるシェルにて、
どうしてもにっちもさっちもいかなくなってというか、
Bシェルで、findとgrepでのファイル検索に時間がかかりすぎるので*1、代用手段としてawkをかじってみたのだが・・


なんですかこのコマンドは!(笑)
とっつきにくいけど、慣れると凄いコマンドであること実感したよ!
何が凄いかって、
それは正規表現が使えることと、なによりスピードが違う。


15万ファイル格納されているディレクトリの中を正規表現でfindすると、
ハードの性能もあるかもしれないが30分かかった*2
でも、それをlsのパイプでawkに通すとなんと5分で処理ができる(驚)


grepでもだいたい同じだった気がするが、grepの弱点は正規表現が使えないこと。

  • eオプションで使えるらしいが、私の環境は使えないというかusr/bin配下の方は使えなかった。

で、今は代用として、lsのパイプでegrepを用いて仕分けをしているが、
このシェル・・入力に癖があって正規表現指定も可なんだよね orz


なので、入力値をegrep用にsedで置換して渡したりしてたけど、
awkを使えば、そういうことがちょちょいのちょい(のはず)


ファイルのタイムスタンプでディレクトリ分けとか余裕だよね♪


でも、awkでもできない問題が一つあって、結局は頓挫しちゃった。
それは何かというと、日付の比較です。。


比較といっても大きい小さいではなくて、今からXXX日前のファイルを圧縮しろとか消せなんてしなきゃならない。


awkでファイル一覧を持ってくるところまでは、できたけどこの問題ではまりました(汗)
awkの時間に関する組み込み関数はシステム時刻とフォーマットしかないみたいで、dateコマンドも-sオプションが使えなかった。


タイムスタンプを加工して秒に変換して引いた数が、XXX日秒より大きければとかできそうなんだけど、よくよく考えてみると閏年とかめんどくさいこと考えないといけない。


これで一気になえちゃって、明日はループの中で一つずつ投げてるコマンドをリスト上にして、一気に投入すれば時間短縮できないか試してみようと思う。


せっかくの興味を無駄にしないためにも、
家に転がってるオライリ本でちょっと勉強してみようかな。

*1:実は1度、完成していたのだが、処理速度が遅すぎて却下されていたりする

*2:timeコマンドで測定