Perl5と互換性のある正規表現が書けます。Perlに慣れた人だったら重宝するかもしれないですね。
pcregrepをインストールする方法
pcregrepコマンドを内包しているPCREはメジャーバージョンが2つあって、ここではPCRE2を使うことにします。
コマンドは、pcre2grepになります。
古いバージョンだと、オプションが少ないし、セキュリティアップデートがあるので最新版を使うとよいです。
MacOSX
$ brew install pcre2 $ pcregrep -V pcregrep version 8.39 2016-06-14CentOS 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.62pcregrepは、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