Perlワンライナー集

perlワンライナーでよく使いかたを忘れるやつ。
  1. 改行コード置き換え
    perl -i.org -pe 's/\r\n/\n/g' filename
  2. 複数条件をREGEXに渡す
    perl -nle '/(AA|BB|CC)/ or print' filename
    ワンライナーREGEXにシングルクォートを含む場合\x27でエスケープする。
  3. コンマで別れている1列のデータを1列に10個ずつ表示し改行する
    perl -ne '@tables = split /,/; $n = 10; $delim = ",";
    while (@x = splice @tables, 0, $n) {print join($delim, @x), "\n";}' filename
  4. Paragraphごとにファイルを出力する
    perl -00 -ne '/(ファイル名になるパターン)/ and open(FH, "> $1\.sql"); print FH "$_"; close(FH);' filename
  5. 特定の文字列からファイルの終わりまでを出力
    perl -nle '/ここにパターン/ .. eof and print' filename
  6. シェル変数をperlの変数に渡す
    perl -sle 'print $x' -- -x=$shell_variable
  7. 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
  8. iostat
    ログファイルで特定のdeviceだけ出力する
    perl -lane '$F[1] =~ /^(xv|dm)/ and print' iostat.log 
    時間帯を絞る
    perl -lane '/^1006092509/ .. /^1006092609/ and print' iostat.log
  9. 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