# '@'が含まれていない行を表示
perl -ne "print unless /@/" aaa.txt
----------------------------------------------------
# 10行ごとに出力
perl -ne "print unless ($. % 10)" INFILE.txt
----------------------------------------------------
# 可変長のレコードを固定長に変換
perl -lne "print pack('A80',$_)" vrec.txt > out.txt
----------------------------------------------------
# 最初の50行を表示
perl -pe 'exit if $. > 50' file
----------------------------------------------------
# 重複行を削除
perl -ne "print unless $line{$_}++" aaa.txt
perl -ne "next if $line{$_}++; print;" aaa.txt
----------------------------------------------------
# ipconfigコマンド出力から'Host','Address'のある行を抽出
ipconfig /all | perl -ne "print if (/Host/ || /Address/)" > c:¥temp¥aaa.txt
----------------------------------------------------
# カンマ区切りファイルの1番目と3〜5番目をコロン区切りで表示
perl -F, -lane "print qq|@F[0]:@F[2]:@F[3]:@F[4]¥n|" aaa.csv
----------------------------------------------------
# 引数で指定したところから拡張子plファイルを見つけて表示します
perl -MFile::Find -le "find {wanted=>sub {print if /¥.pl$/;}},$ARGV[0]"
----------------------------------------------------
# 指定されたページを取ってきて表示します。
perl -MLWP::Simple -e "getprint qq|http://www.fpu.ac.jp/|";
----------------------------------------------------
ワンライナーのオプション
-e : 引数に記述された内容を実行
-n : 引数全体がwhile(<>){...} に囲まれたように動作
-p :「-n」に加えてループの最後にprint文が実行
----------------------------------------------------------------------
# ファイル内の文字列を置換(正規表現可)
perl -pe "s/置換前/置換後/g" filename
----------------------------------------------------------------------
# filenameの「#で始まる行と行の途中からの#以降」と空白の行を削除
perl -pe "s/^¥s*#.*¥n$|#.*$|^¥s*$//" filename
----------------------------------------------------------------------
# grepのように使う
perl -ne "print if (/検索パターン/)" filename
----------------------------------------------------------------------
# ミリ秒表示のUTC時間を読みやすい形式に変換
perl -pe "s/^¥d+¥.¥d+/localtime $&/e" filename
----------------------------------------------------------------------
Perl ワンライナー Tips
図16 複数コマンドでのワンライナー
$  perl -e 'print "3の倍数¥n"  for (1..100) {if (($_ % 3) == 0) {print $_ . "¥n" }}'
C:¥>perl -e "print ¥"3の倍数¥n¥"; for (1..100) {if (($_ % 3) == 0) {print $_ . ¥"¥n¥"}}"
図17 ファイル名の一覧を取得しコピーコマンド生成
$  ls | perl -ne 'chomp; print "cp -p $_ $_.old¥n"'
c:¥>dir /b | perl -ne "chomp; print ¥"copy /y $_ $_.old¥n¥""
図18 ファイルの一部分を表示する
$  perl -ne 'print if 15 .. 17' ファイル名
c:¥>perl -ne "print if 15 .. 17" ファイル名
図19 文字を置き換える
$  echo 'halllllo, world' | perl -pe 's/h[ae]l+o/hello/'
c:¥>echo "halllllo, world" | perl -pe "s/h[ae]l+o/hello/"
図20 -lオプションを利用して置き換え
$  ls | perl -nle 'print "cp -p $_ $_.old"'
c:¥>ls | perl -nle "print ¥"copy /y $_ $_.old¥""
図21 桁を指定して出力する
$ ls -l | perl -ane 'print "$F[4]¥t$F[8}¥n"'
図22 CSV形式ファイルの特定カラムを抽出表示
$ cat test.csv
10,20,30
40,50,60
$ perl -F, -alne 'print $F[1}' test.csv
図23 ファイルの中身を置換する
$ perl -pi -e 's/mae/saki/g' *.txt
図24 ファイルの中身を置換+バックアップを作成する
$ perl -pi.bak -e 's/mae/saki/g' text.txt
図25 ファイルの中身を置換+日付付バックアップを作成する
$ perl -pi.`date +%Y%m%d` -e 's/mae/saki/g' text.txt
図26 Webの内容を取得する
$ perl -MLWP::Simple -e 'print get("http://gihyo.jp")'
図27 画像ファイルのEXIF情報を取得する
$ perl -MImage::ExifTool -e '$exif = new Image::ExifTool->ImageInfo(shift); foreach (sort keys %$exif) { print("$_ : $exif->{$_}¥n");}' test.jpg
図28 Base64でエンコード・デコードする
$ perl -MMIME::Base64 -ne 'print MIME::Base64::encode_base64($_)' ファイル名
$ perl -MMIME::Base64 -ne 'print MIME::Base64::decode_base64($_)' ファイル名
-nオプション
 -eに−nオプションを付けることで,標準入力
から読み込んで,その内容に対して処理を行うよ
うになります.
●ファイル名の一覧を取得しコピーする
図17は,lsコマンドでファイル名を出力し,
そのファイル名をコピーするシェルスクリプトを
表示する例です.
●ファイルの一部分を表示する
図18は,ファイル名の15〜17行目を表示し
ます.「15‥17」は,入力ファイル内の現在の行
番号を意味する$.変数に対して評価され,結果と
して15〜17行目が表示されます.
-pオプション
 -nオプションと同様に,標準入力から読み込ん
だ内容に対して処理を行います.−nと異なるのは,
処理結果を標準出力に出力する点です.フィルタ
として利用すると便利です.
●文字を置き換える
図19では,文字列の置き換えに正規表現を使っ
ています.「s/」は,「s//演算子」と呼ばれ,
スラッシュで区切られた前半部分を後半部分へ置換しま
す.図19では,正規表現のhlae11+0をhelloへ置
き換えることを意味します.
-lオプション
 -lオプションを-nと-pに組み合わせて利用す
ると,処理を行う前に標準入力に対してchompを
実行します.また,出力に対して強制的に改行を
行います.
図17のファイルをコピーするスクリプトを出
力する例を図20として書き直しました
 Chompと¥nがなくなり,シンプルになりました.
-aオプション
 -aオプションは,テキスト1行を空白文字で分割し,
分割した結果を@Fという特別な配列に入れます.
おもに-nもしくは-pと組み合わせて利用します.
配列@Fの添字はゼロから始まります.
●任意の桁を抽出して出力する
図21では,5桁目と9桁目を抽出して出力して
います.
-Fオプション
 -aオプションに−Fオプションを組み合わせる
と,@Fに分割する際の区切りとなる文字を変更
できます.
●CSV形式のファイルの特定のカラムを抽出して表示
図22では,-Fの後にカンマを記載することで,
カンマ区切りで@Fに入れています.csvファイル
から2桁目を抽出して表示しています.
-iオプション
 -iオプションは,ファイルを置換します.
●ファイルの中身を置換する
図23では,拡張子txtのファイル中にある文字
列 mae を saki に置換し,ファイルそのものも置き
換えています./gを付けることで,1行に複数の
文字列があっても,すべてを置換するようになり
ます.ファイルの中身を一括して置換したいこと
は多くありますが,Perlワンライナーで実行でき
ます.
●ファイルの中身を置換する際にバックアップを作成する
図24では,-iの引数として文字列を指定する
ことで,元ファイルのバックアップを取得してい
ます.元ファイルに「.bak」との拡張子を付けて
保存します.結果として,test.txt の中身は文字列
 mae が文字列 saki に置換され,元ファイルは
 test.bak として保存されます.
●ファイルの中身を置換する際に日付を入れたバック
アップを作成する
ワンライナーもシェルからの実行に過ぎないた
め,シェルのバッククォートとの連携も使えます・
図25は date コマンドの出力を利用する例です.
 test.txt の中身は図24と同様に置換され,
 test.txt.20090318 のように,実行した日付が保存され
ます.
 CPANを使ったワンライナー
 CPANの機能をワンライナーからも利用するこ
とができます.Perlのワンライナーから呼び出す
ことで,CPANの機能をあたかもOSのコマンド
であるかように利用できます.
-Mオプション
 -Mオプションは,実行する際にPerlモジュー
ルを指定します.−Mの後にそのままPerlモジュー
ル名を記載します.たとえば,LWP::Simple を利
用する場合は,「-MLWP::Simple」と指定します.
●Webの内容を取得する
図26のようにすると,Webの内容を取得する
ことができます.
●画像ファイルのEXIF情報を取得する
図27では,画像ファイルのEXIF情報を取得
しています注2
●Base64でエンコード/デコードする
 Base64のエンコード/デコードは何かと使う機
会がありますが,図28のようにモジュールを使っ
てワンライナーで記載できれば便利です.
=============================================================================