I ♥ WordPress

[時間割:Perl]『ミニマルPerl』その6
2008/10/28 01:49 posted by kunkichi

火曜日は『Perl』の時間です。行をまたがる正規表現のところから。

  • 普通は . でニューライン(¥n)はとれないのだけど、シングルラインモードを使えば¥nもマッチ対象とすることができる。これを使って複数行にまたがるマッチングを行う。$ cat lines.txt
    abcde fghij
    klmno pqrst
    uvwxyz
    $ perl -00 -wnl -e '/\bfghij\b.*\bklmno\b/si and print $&;' lines.txt
    fghij
    klmno
  • ポイントは以下。
    • 入力レコードセパレータを-00とか-0777とか複数行読み込めるものにする。
    • マッチ修飾子にシングルラインモード(s)を有効にして、¥nがマッチするような正規表現を書く。*. とか。
  • いろいろ試してみる。BINDのqueryログから、問い合わせホスト名が2文字のTLDで終わっているものを参照。$ perl -wnl -e '/query: \S+\.[a-z][a-z] /i and print;' query.log27-Oct-2008 23:28:02.221 queries: client XXX.XXX.XXX.XXX#XXXXX 〜 query: atode.cc IN A +
    27-Oct-2008 23:54:14.192 queries: client XXX.XXX.XXX.XXX#XXXXX 〜 query: www.uniqlo.jp IN A +
    27-Oct-2008 23:59:02.339 queries: client XXX.XXX.XXX.XXX#XXXXX 〜 query: www.oreilly.co.jp IN A +
    さらに.jpドメインのものを除外する。$ perl -wnl -e '/query: \S+\.[a-z][a-z] /i and ! /query: \S+\.jp /i and print;' query.log27-Oct-2008 23:28:02.221 queries: client XXX.XXX.XXX.XXX#XXXXX 〜 query: atode.cc IN A +
  • String::Approxを使ってファジーマッチングも可能。# cat fuzzy_match
    ----------
    #!/usr/bin/perl -s -wnl
    use String::Approx 'amatch';
    amatch $pattern, [ "i", "20%" ] and print;
    ----------
    echo "yafoo" | ./fuzzymatch -pattern='yahoo'
    yafoo
  • スクレイピングの例。www.php.netの右上にあるStableのバージョンのうち、5.X系のバージョンを取得する。$ lwp-request -o text www.php.net | perl -wnl -e '/Stable/ and /5\.\d\.\d/ and print $&;'
    5.2.6

以下、grep処理のまとめ

grepコマンド Perlでの書き方
grep ‘〜’ perl -wnl -e ‘/〜/ and print;’
grep -v ‘〜’ perl -wnl -e ‘/〜/ or print;’
grep -i ‘〜’ perl -wnl -e ‘/〜/i and print;’
grep -l ‘〜’ perl -wnl -e ‘/〜/ and print $ARGV and close ARGV;’
fgrep ‘〜’ perl -wnl -e ‘/¥Q〜¥E/ and print;’

シチュエーションによってはgrepのほうが簡単な場合もあるけど、まあそこはケースバイケースで。ちょくちょく使って慣れていこう。。

コメント&トラックバック

トラックバックURL





このページの先頭へ