メモ: テキストログをgnuplotで表示するコマンドの例

次の記事を興味深く読みました。

ところで・・・

シェルは素敵だよ!!

例えば Web サーバのデバッグ。なにかが急上昇していないかログから調査したい場合、

Apr 8 2012 14:33:59 POST ...
Apr 8 2012 14:34:00 GET ...
Apr 8 2012 14:34:00 GET ...
Apr 8 2012 14:34:01 POST ...
こんなログだったら

cut -d' ' -f1-4 log.txt | xargs -L1 -I_ date +%s -d_ | uniq -c | (echo "plot '-' using 2:1 with lines"; cat) | gnuplot
こんなコマンドで、すぐに何が起きているかが把握できるグラフを取得できます。

Kosei Kitahara's Blog: Dropbox のスケールとか

上のコマンドの意味が分からず、こっそり調べて試したので、メモしておきます……。

コマンドの意味

cut

テキストファイルから指定部分を切出して表示する。

オプション 役割
-d フィールドの区切文字を指定。デフォルトはタブ。
-f フィールド単位での切出し。-f1-4は、1〜4番目のフィールドを指す。
log.txt 切出し対象のファイル名。

xargs

標準入力を読み込んでコマンドラインを作成し、実行する。

オプション 役割
-L1 1コマンドラインにつき最大1行の入力行を使う。
-I_ date +%s xargsで実行するコマンドの引数に、ここで指定した文字が現れた場合、標準入力から読み込んだ名前に置き換える。日付を1970/01/01 00:00:00からの経過秒のフォーマットに変換。
-d_ 入力された文字の区切り文字。dateのオプション(xargsのオプションではない)。引数に指定された日付と時刻を表示する。追記参照。

uniq

入力ファイル中、重複した行を1行だけ表示する。

オプション 役割
-c 各行の出現回数を内容とともに表示する。

gnuplot

gnuplotの起動。

オプション 役割
using プロットするデータを指定
with lines 線を引く。

ちなみに、xargsの-Iオプションと-dオプションの直後のアンダースコアって何のためにあるんでしょ。findutilのxargs.cをちらっと読んでみたけど分からず。なんダロ??(ちゃんと読めやって話ですね、すいませんすいません…アンダースコアのあるときとないときとで挙動が違うのは理解したんだけど、このメモの趣旨と逸れるので詳細は省略)教えて頂きました。追記参照。

(追記: 2012/07/23)

アンダースコアは、標準入力を読み込むものだと分かりました。{}の代わりに使える記述方法なんですね。

また、最初に整理したオプション表に誤りがありました。dateの後の-dは、xargsコマンドのオプションではなく、dateコマンドのオプションでした。(表を再整理済み)

  • d_で標準入力を取り込み、-Iに渡しているのですね。
$ cut -d' ' -f1-4 log.txt | xargs -L1 -I_ date +%s -d_ | uniq -c
      1 1333863239
      2 1333863240
      1 1333863241
$ cut -d' ' -f1-4 log.txt | xargs -L1 -I_ date +%s | uniq -c
      4 1343014868
$ date +%s
1343014874

オプションの-dを付けないと、変換自体は機能するものの、変換対象を読み込まないようで、現在時刻に統一されて集計されてしまいます。

いずれもコメントで指摘頂きました。finalfusionさん、ありがとうございます!

実行

gnuplotが入っていなければ、インストールします。# インストール方法は環境に合わせて適宜。

sudo apt-get install gnuplot

gnuplotがグラフを描画した後、すぐに終了してしまうのを防ぐために、gnuplot起動オプションに「-persist」をつけます。

cut -d' ' -f1-4 log.txt | xargs -L1 -I_ date +%s -d_ | uniq -c | (echo "plot '-' using 2:1 with lines"; cat) | gnuplot -persist

記事と同じ内容のログファイルを読み込ませると、こんなグラフが出ます。

ログエントリの集中を時系列でパッと見ることができますよ〜という話だったんですね。なるほど! それは素敵ですね!!(一周遅れ)

所感

といいつつ、ふだんは総合的な監視ツールのお世話になっているので、上のような方法でログを見ることは正直あまりありません。

でも、たとえば監視の基盤に載せていない検証環境で、ふとパフォーマンスを見たい時に、ささっとこういったことができれば、きっと便利ですよね。

お勧めなコマンドたち: sed, awk, grep, cut, head, tail, sort, uniq, tr, date, xarg

Kosei Kitahara's Blog: Dropbox のスケールとか

・・・らしいので、精進したいです。