Perl実用メモ その1

シェルスクリプトの文字列処理補強の目的でPerlを利用したいと考えていた最中に、下記の良書を発見した。

ミニマルPerl ―Unix/LinuxユーザのためのPerl習得法

ミニマルPerl ―Unix/LinuxユーザのためのPerl習得法

学んだ記法を用いて、実用コマンドを考えてみたので以下に列挙しておく。

トリミング

#トリミング(前後のスペースを排除)
echo '  ho ge ' | perl -wnl -e '/[  ]*(.*)[  ]*/ and print $1'

#内部のスペースも排除
echo '  ho ge ' | perl -wnl -e 's/[  ]//g and print'
#(参考:もちろんsedでも同等の処理が可能)
echo '  ho ge ' | sed 's/[  ]//g'

ログ検索

#ログのブロック検索
cat server.log | perl -wnl -00 -e '/PWC3999/ and print'
perl -wnl -00 -e '/PWC3999/ and print' server.log

# ブロック間の間切り表示を追加
perl -wnl -00 -e '/PWC3999/ and print("$_\n****************")' server.log

# ブロックのナンバリングを追加
perl -wnl -00 -e 'BEGIN{${COUNT}=1;} /PWC3999/ and print("${COUNT}個目\n$_\n****************") and ${COUNT}++;' server.log

CSV

#ダブルクオート囲いのCSV。ダブルクオートのエスケープは ""
#  マッチする行を表示
printf 'a,b,c\n"a","b","c"\n"a""a","b""b","c"\n'  | perl -wnl -e '/("([^"]|"")*",)*("([^"]|"")*")$/ and print;'

#  特定の列番号(下記例では2番目)の値のみを表示
printf 'a,b,c\n"a","b","c"\n"a""a","b""b","c"\n'  | perl -wnl -e '/("([^"]|"")*",){1}"(([^"]|"")*)".*$/ and print("$3");'

#  特定の列番号(下記例では2番目)の値のみを表示。その上で "" を " に置換
printf 'a,b,c\n"a","b","c"\n"a""a","b""b","c"\n'  | perl -wnl -e '/("([^"]|"")*",){1}"(([^"]|"")*)".*$/ and print("$3");' | sed 's/""/"/g'