tsvファイルやcsvファイル等をそのままSQLであれこれしてしまおうという感じ。
ということで面白そうなので使ってみました。
1 |
wget https://github.com/harelba/packages-for-q/raw/master/rpms/q-text-as-data-1.5.0-1.noarch.rpm |
で、rpm取得してインストール
1 |
rpm -ivh [ダウンロードしたファイル] |
早速使ってみましょう。
コレ、CSVとかで無くても大丈夫見たいなのです。
なので今回はアクセスログをゴニョゴニョしてみます。
1 2 |
less /var/log/httpd/access.log | \ q select * from - limit 10 |
で行けるみたいです。
出力結果は、まぁ元のファイルに依存するみたいなのでそれぞれ見ていただければと思います。
オプション
-D
出力のファイルのデリミタ
ex)
-D $’\t’ => TSVファイル
-d
入力のファイルのデリミタ
ex)
-d , => CSVファイル
-O
出力ファイルのヘッダーを出力
-H
入力ファイルのヘッダーをカラム名として利用
-e
入力ファイルの文字エンコーディング
-Q
クエリの文字エンコーディング
などなど
後は
1 |
man q |
でご確認を
1 2 3 4 5 6 7 8 9 10 11 12 13 |
xxx.xxx.xxx.xxx - - [02/Mar/2015:23:59:52 +0900] "GET / HTTP/1.1" 200 13483 - "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53" 0 xxx.xxx.xxx.xxx - - [02/Mar/2015:23:59:52 +0900] "GET / HTTP/1.1" 200 13483 - "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53" 0 xxx.xxx.xxx.xxx - - [02/Mar/2015:23:59:30 +0900] "GET / HTTP/1.1" 200 13431 - "Mozilla/5.0 (Linux; U; Android 4.2.2; ja-jp; SH-07E Build/SA160) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30" 0 xxx.xxx.xxx.xxx - - [02/Mar/2015:23:59:43 +0900] "GET /article-list/?abcid=4799 HTTP/1.1" 200 8449 http://precs.co.jp/?paf=MEG_DAILY_20150302_SP&openid=201503022504645 "Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53" 0 xxx.xxx.xxx.xxx - - [02/Mar/2015:23:59:07 +0900] "GET /article-list/?abcid=4793 HTTP/1.1" 200 11175 http://precs.co.jp/ "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B440 APP_CLINET/WEBVIEW/V3.1" 0 xxx.xxx.xxx.xxx - - [02/Mar/2015:23:58:17 +0900] "GET /cart-list/ HTTP/1.1" 200 6238 http://precs.co.jp/article/detail/148339?color_id=242483 "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A366 Safari/600.1.4" 0 xxx.xxx.xxx.xxx - - [02/Mar/2015:23:58:34 +0900] "GET /article-list/?abcid=4456 HTTP/1.1" 200 9768 http://precs.co.jp/?paf=affi_smart-c "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B466 Safari/600.1.4" 0 xxx.xxx.xxx.xxx - - [02/Mar/2015:23:59:03 +0900] "GET /article-list/?abcid=4605 HTTP/1.1" 200 8719 http://precs.co.jp/?paf=MEG_DAILY_20150302_MB&openid=201503022165761 "Mozilla/5.0 (iPhone; CPU iPhone OS 7_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D167 Safari/9537.53" 0 xxx.xxx.xxx.xxx - - [02/Mar/2015:23:58:20 +0900] "GET /article-list/?abcid=4523 HTTP/1.1" 200 10540 http://precs.co.jp/ "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B440 APP_CLINET/WEBVIEW/V3.1" 0 xxx.xxx.xxx.xxx - - [02/Mar/2015:23:58:16 +0900] "GET /jb/s_css/set_all2.css?v=2012036843 HTTP/1.1" 200 22671 "http://precs.co.jp/product-list/?slid=4336&maf=MEG_DAILY_20150301_SP&openid=2015030126175&tc=A_5_1__12" "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B466 Safari/600.1.4" 0 xxx.xxx.xxx.xxx - - [02/Mar/2015:23:58:01 +0900] "GET / HTTP/1.1" 302 20 - "Mozilla/5.0 (iPad; CPU OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B329 Safari/8536.25" 0 xxx.xxx.xxx.xxx - - [02/Mar/2015:23:58:17 +0900] "POST /cart-cart_data/ HTTP/1.1" 302 20 http://precs.co.jp/article/detail/148339?color_id=242483 "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12A366 Safari/600.1.4" 0 xxx.xxx.xxx.xxx - - [02/Mar/2015:23:58:01 +0900] "GET /jb/s_js/common.js?v=2012032626 HTTP/1.1" 200 2200 "http://precs.co.jp/" "Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B436 Safari/600.1.4" 0 |
的なファイルがあったとして、
iPhone、Android、その他でデバイス別に各ファイルのアクセス数をソートして見てみたい
といった時
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
less ./access_log-web8.2015-03-02 |\ q -D$'\t' " SELECT COUNT(*) AS ccc, CASE WHEN c10 LIKE '%iPhone%' THEN 'iPhone' WHEN c10 LIKE '%Android%' THEN 'Android' ELSE 'other' END AS device, c6 FROM - where c6 NOT LIKE '%.js%' AND c6 NOT LIKE '%.css%' AND c6 NOT LIKE '%woff%' AND c6 NOT LIKE '%.ico%' GROUP BY c6 , device ORDER BY ccc DESC LIMIT 20" |
とかとかやれば
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
ccc device c6 4063 iPhone GET / HTTP/1.1 1183 Android GET / HTTP/1.1 890 iPhone GET /article-list/?slid=4799 HTTP/1.1 868 iPhone GET /article-list/?slid=4793 HTTP/1.1 836 iPhone GET /cart-list/ HTTP/1.1 726 iPhone GET /article-list/?slid=4456 HTTP/1.1 706 iPhone GET /article-list/?slid=4605 HTTP/1.1 664 iPhone GET /article-list/?slid=4523 HTTP/1.1 588 other GET / HTTP/1.1 520 iPhone POST /cart-cart_data/ HTTP/1.1 481 iPhone GET /article-list/?slid=4834 HTTP/1.1 458 iPhone GET /article-list/?slid=4624 HTTP/1.1 434 iPhone GET /article-list/?slid=4336 HTTP/1.1 412 iPhone GET /article-list/?slid=4608 HTTP/1.1 379 Android GET /jb/s_css/font/websymbols-regular-webfont.ttf HTTP/1.1 355 iPhone GET /article-list_all/ HTTP/1.1 303 Android GET /cart-list/ HTTP/1.1 300 iPhone GET /ranking/ HTTP/1.1 299 iPhone GET /summarize-top/?id=192 HTTP/1.1 294 iPhone GET /subscriptions-mclp_02s_06_a-top/?maf=ognc HTTP/1.1 |
的な結果が帰ってくる
JOINもできるみたいなので、色々やれそうで面白いですね。
で、中でどうやってるのかなーとソースを見てみる。
https://github.com/harelba/q/blob/master/bin/q
githubで公開されているのでかる~く流し読み。
1 |
self.conn = sqlite3.connect(':memory:') |
ほほぅ なるほど
sqlite使ってるのね
メモリ型でやってるから高速に処理できると。
と、いうことは、sqliteの構文ならそれなりに使えそう。
機会があれば色々使ってみようかな。