最近、なんだかログをパースしてデータ抜き出して、他のプログラムに渡してとかそんなことが続いたので書いてみる。
スペースやタブで区切られたデータから必要な部分を抜き出すときは awk が早くてかつ手軽です。
$ cat hogehoge.txt
dakara 102912 ok 102 at line 1929
$ awk '{print $2}' hogehoge.txt
102912
$ awk '{print $4}' hogehoge.txt
102
perl の配列のインデックスとちがって $1 が最初のカラムの値、なのでログを見ながら「いち、に、さん、し」と数えてから指定してる。声を出しながら数えるとなお良い。
-F オプションでスペースじゃない区切り文字を指定して使ったりすることも多い。$ cat foobarbaz.txt
id:29129 has been stored successfully Qootas:Model:File:194832:OK
$ awk -F: '{print $5}' foobarbaz.txt
19432
grep みたいにパターンマッチした行だけ表示とか( awk '{$2 ~ /index.html/ {print $11}' access_log )あるけど、ここでは省略。
もうちょっと、複雑というか決まった文字列のあとの数字とかを取りたいときは、sed と組み合わせて、いったん削ってから awk とか。
$ cat e2008.txt
giving [kudos] to al::gore::hack::the::debate[19284482] at current.com
$ sed -e 's/.*::debate\[//' e2008.txt
19284482] at current.com
$ sed -e 's/.*::debate\[//' e2008.txt | awk -F\] '{print $1}'
19284482
あとは、その切り出したデータから、次に起動するプログラムを作っておいて、オプションとかが間違いないのを確認しつつ、最後に
| sh - とかで「流し込む」感じがこれまたたまらないのですな。この流し込むタイミングでよく「ドーン」とか言う。$ sed -e 's/.*;:debate\[//' e2008.txt | awk -F\] '{print $1}'
19284482
$ sed -e 's/.*;:debate\[//' e2008.txt | awk -F\] '{print "/opt/vinfo "$1}'
/opt/vinfo 19284482
$ sed -e 's/.*;:debate\[//' e2008.txt | awk -F\] '{print "/opt/vinfo "$1}' | sh -
URL: http://current.com/items/89363730_al_gore_speaks_at_hack_the_debate_2008
vimeo_id: 1865919
time: 19 hours ago
その都度、まじめにパースするための script とかを作ってもいいんだろうね。けど、一回しか使わないものとかいらないしな。なんといっても、このパイプでどんどん切り刻んでいく感じが「気持ちいい」のだ。ま、それだけの話。おじさん臭いのはかんべん。

コメントする