2016年8月2日火曜日

pcregrepコマンドを使ってみる

pcregrepは、grepコマンドと同じように、文字パターンを指定してファイルを検索するコマンドです。
Perl5と互換性のある正規表現が書けます。Perlに慣れた人だったら重宝するかもしれないですね。

pcregrepをインストールする方法

pcregrepコマンドを内包しているPCREはメジャーバージョンが2つあって、ここではPCRE2を使うことにします。
コマンドは、pcre2grepになります。
古いバージョンだと、オプションが少ないし、セキュリティアップデートがあるので最新版を使うとよいです。

MacOSX
$ brew install pcre2
$ pcregrep -V
pcregrep version 8.39 2016-06-14
CentOS 6
# yum --enablerepo=epel install pcre2-tools
# pcre2grep -V
pcre2grep version 10.21 2016-01-12

以下、使い方の例です。

nginxのログから、IPアドレスの数でソート
# pcre2grep -o 'host:[0-9.]+' access.log | sort | uniq -c | sort -bg
    704 host:127.0.0.1
    736 host:5.104.241.192
    800 host:54.64.148.39
    843 host:5.104.241.190
    870 host:157.55.39.63
    888 host:40.77.167.67
    968 host:157.55.39.222
   1100 host:207.46.13.10
   1134 host:40.77.167.89
   1509 host:182.250.248.43
   2296 host:122.132.171.187
   2580 host:40.77.167.39
   3298 host:157.55.39.176
   3320 host:118.9.19.37
   7400 host:153.126.157.62
pcregrepは、grepより検索が早かったので、ログが大きい場合につかってみるといいかもしれません。 以下、timeをつけて時間を測った結果です。10倍近く差がでました。
grepの場合
# time grep -o -E 'host:[0-9.]+\s' access.log | sort | uniq -c | sort -bg
real 0m6.049s
user 0m5.973s
sys 0m0.077s

pcre2grepの場合
# time pcre2grep -o 'host:[0-9.]+(?=\s)' access.log | sort | uniq -c | sort -bg
real 0m0.759s
user 0m0.724s
sys 0m0.037s

特定の検索語を2つ以上指定して検索
# pcre2grep -o1 -o2 --om-separator=' ' '(iPad).*(reqtime:\d+\.\d+)' access.log
iPad reqtime:0.000
iPad reqtime:0.198
iPad reqtime:0.242
iPad reqtime:0.000
iPad reqtime:0.044

See also)
http://www.pcre.org/current/doc/html/pcre2grep.html

top image frpm Indi Samarajiva Mika Tennekoon Art