linux最近、LTSVがお気に入りでApacheのログ始め各種ログをLTSVにしています。LTSVの何が便利って、普通のCSVやとかと違って、その名の通りラベルが付いてるので順番では無く名前ベースで簡単にアクセスできること。順番では無いので、後から項目とかを追加とか入れ替えをしやすくて、集計スクリプトとかと非常に相性が良いことでし。「日次で集計してグラフ化する」だとか「DBに入れる」とか、そういったシステム化した定常的な解析はRubyなりで書けばいいので問題ないのですが、障害対応やちょっとした思いつきなんかで、awkでワンライナーな分析/集計をしちゃう場合にはLTSVは不便だったりします。下記のようなLTSVベースのログがあるとします。+0900]req:/test1response:10上記のログのtest1だけの平均レスポンスをさくっと求めたい、とかはよくあるケースですね。普通にawkで書くとこんな感じ。いうか、これならCSVやTSVのほうがまだ楽ですね。substrがいらないので。この問題を解決するべく、簡単なawkとシェルでltsv.shというフィルタを書いてみました。これを使うと先ほどのコードは下記のように書けます。sum/cnt}'見て分かる通り、awkがそのまま書けるのですが、名前ベースでカラムにアクセスしていることが分かります。実際の振る舞いとしては、ltsvという関数を追加してLTSVを連想配列に変換しているわけです。これだけで、めちゃめちゃ可読性があがりました!もちろん、パイプで繋ぐことも可能です。これまた良くあるn秒以上のリクエストのカウントはこんな感じ。ちなみにintでキャストしないと文字列なので正しく数値比較できないです。こちらの実装は非常にシンプルで、下記のようになります。LTSV見たまんま単にltsvという関数を定義して文字列としてくっつけただけですwBashのヒアドキュメントで定義できるので、毎回awkにこの関数を手で適用するわけじゃないので、とても簡単です。ようはinclude的なことをしてるわけですが、awkでどうやれば良いのかわからないので、こんな力技な方法になってしまいました。他に良い方法があれば誰か教えて下さい>_<なんにしても、これで自分的にはltsvで困ることがほぼなくなったので、より利用を促進して行きたいとおもいます。2016」の記事...2013-08-01時間あたりの平均レスポンスとかを求めるのに便利なコマンドを書いてみたどうも、最近、ログの解析ばかりしています。(7)月別アーカイブはてなブログをはじめよう!pascal256さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。