Perlワンライナー集
perlワンライナーでよく使いかたを忘れるやつ。
- 改行コード置き換え
perl -i.org -pe 's/\r\n/\n/g' filename
- 複数条件をREGEXに渡す
perl -nle '/(AA|BB|CC)/ or print' filename
ワンライナーでREGEXにシングルクォートを含む場合\x27でエスケープする。 - コンマで別れている1列のデータを1列に10個ずつ表示し改行する
perl -ne '@tables = split /,/; $n = 10; $delim = ","; while (@x = splice @tables, 0, $n) {print join($delim, @x), "\n";}' filename
- Paragraphごとにファイルを出力する
perl -00 -ne '/(ファイル名になるパターン)/ and open(FH, "> $1\.sql"); print FH "$_"; close(FH);' filename
- 特定の文字列からファイルの終わりまでを出力
perl -nle '/ここにパターン/ .. eof and print' filename
- シェル変数をperlの変数に渡す
perl -sle 'print $x' -- -x=$shell_variable
- sar -uのログファイルを加工するPerlのワンライナー ※先輩からの頂き物
perl -lane '$ARGV=~s/.*(\d{2}n\d{1})_(\d{8})\.log$/$1 $2/;($h,$d)=split(q/ /,$ARGV);$F[0]=~/^(0[0-8]:\d{2}:\d{2}|09:[0-3][0-9]:\d{2})/ and $d++; print qq/$h $d $_/' *.log
- iostat
ログファイルで特定のdeviceだけ出力するperl -lane '$F[1] =~ /^(xv|dm)/ and print' iostat.log
時間帯を絞るperl -lane '/^1006092509/ .. /^1006092609/ and print' iostat.log
- top
ログファイルの各行にTimestampをつけるperl -nle '/^top - ([\d:]+)/ and $t=$1;print qq/$t $_/' top.log > tmp1.log
特定の時間だけを取り出すperl -lane '/^03:00:16/ .. /^04:00:17/ and print' tmp1.log > tmp2.log
二列目が数値のものだけを取り出す。これによりプロセスのみを取り出すことができる。perl -lane '$F[1] =~ /^([\d]+)/ and print' tmp2.log > tmp3.logs