「正規表現でマッチするものを取得したい。」
- ログから必要な部分だけ抜き出したい...
- けど正規表現で一気に書くのって面倒臭い...
<例> /([\d.]+) - - [([^]]+)] "[A-Z]+ .*.+ HTTP\/[\d.]+" (\d+) .+ \d+ "[^""]+" "[^""]+"/
こんな暗号どうやって紐解けばいいんだよ...
って事で始めるよ
【手順①】欲しい部分をピックアップ
sample.log
127.0.0.1 - - [18/Nov/2016:10:20:30 +0900] "GET /dummy/aaa/ HTTP/1.1" 200 12345 67890 "-" "Java/1.7.0_79"
~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~
└>IPアドレス └>日時 └>ステータスコード
こんなログがあるとして、
その中から今回は「IPアドレス」「日時」「ステータスコード」を取得してくる事とします。
【手順②】欲しい数だけ () を用意
reg.rb
/() () ()/
今回は3つなのでこんな感じ。
【手順③】 () の中や外に正規表現を書いていく
reg.rb
/([\d\.]+) \- \- \[([^\]]+)\] "[A-Z]+ .*.+ HTTP\/[\d\.]+" (\d+) .+ \d+ "[^""]+" "[^""]+"/
#~~~~~~~~~ ~~~~~~~~~~ ~~~~~~~
- Point
- 欲しいところは()で括る
- 要らないところも正規表現で書く
【手順④】動作確認
reg.rb
log = '127.0.0.1 - - [18/Nov/2016:10:20:30 +0900] "GET /dummy/aaa/ HTTP/1.1" 200 12345 67890 "-" "Java/1.7.0_79"'
if str = log.match(/\A([\d\.]+) \- \- \[([^\]]+)\] "[A-Z]+ .*.+ HTTP\/[\d\.]+" (\d+) .+ \d+ "[^""]+" "[^""]+"/)
puts str[1] # => 127.0.0.1
puts str[2] # => 18/Nov/2016:10:20:30 +0900
puts str[3] # => 200
end
実際に動かして、取得できるか見てみよう。
以上
【補足①】
正規表現が正しいのか、どうなってるのか分からない時はこれを使おう。
https://regexper.com/
可視化してくれるからオススメです。是非。
【補足② 2017/02/20】
プログラム言語によって、使用されている正規表現エンジンが異なります。
Rubyの場合は上記で上手くいくけど、他の言語だと上手くいかない事もあるので、注意しよう!!!