読者です 読者をやめる 読者になる 読者になる

カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

perlのワンライナーを使えるとカッコイイという話

みなさま、perl使ってますでしょうか。

タイトルは釣りですが、結論から言うと、ワンライナーを書くならperlを使いましょうという話です。

理由は単純に、パッケージいれなくてもすぐ使えるのと、perlスクリプトを解読するのに知識が生きるからという理由からですね。Pythonでも同じなので、そこは止めません。

障害対応をしているとワンライナーを使うことも非常に多いので、使い方を説明してみます。是非覚えてみましょう。

オプション説明

まず、オプションの説明をしていきます。

-lオプションは改行を入れてくれます。また、ワンライナーのコマンドとして実行するには-eオプションが必要です。

$ perl -le 'print "Hello"'
Hello 
 
# lをつけないと、こうなる
$ perl -e 'print "Hello"'
Hello%

次にこういうファイルをベースに説明します。

$ cat sample1.txt
1行目 2列目
2行目 2列目
3行目 2列目
4行目 2列目

入力を一行ずつ処理する場合は、-nオプションが必要です。 また、「$.」は行数、$_はその行の内容を表示してくれます。

$ perl -nle 'print "$.:$_"' sample1.txt
1:1行目 2列目
2:2行目 2列目
3:3行目 2列目
4:4行目 2列目

awkのように特定のフィールドを抜き出したい場合は-aオプションを使い、$Fnを使います。nは0から始まるので、気をつけましょう。

$ perl -anle 'print "$.:$F[0]"' sample1.txt
1:1行目
2:2行目
3:3行目
4:4行目
 
$ perl -anle 'print "$.:$F[1]"' sample1.txt
1:2列目
2:2列目
3:2列目
4:2列目

if使って分岐したい場合は、以下のようにします。

$ perl -anle 'if($F[0] == "1行目") {print}' sample1.txt
1行目 2列目

とか

$ perl -anle 'if($F[0] == "1行目") {print $F[1]}' sample1.txt
2列目

のようにできますね。

発展編

もう少し実践的なものをやってみましょう。

このようなファイルがあるとします。

$ cat sample2.txt
busy.value 2
idle.value 128
max.value 600

1列目をキーに、2列目を値にして、表示してみます。こうすることで、四則演算などができるようになります。

$ perl -ane 'my %hash = ( $F[0] => $F[1]); foreach $key ( keys %hash ) { print "KEY: $key : VALUE: $hash{$key}", "\n" }' sample2.txt
KEY: busy.value : VALUE: 2
KEY: idle.value : VALUE: 128
KEY: max.value : VALUE: 600

こんなファイルがあったとします。

$ cat sample3.log
17:22 log1 desu
17:22 log1 desu
17:22 log1 desu
17:22 log1 desu
17:23 log2 desu
17:23 log2 desu
17:24 log3 desu

分毎に、何行あるかカウントしたい場合は以下のようにします。

$ perl -ne 'if(/(\d\d\:\d\d)/){$c{$1}++}END{for(sort keys %c){print "$_: $c{$_}\n"}}' sample3.log
17:22: 4
17:23: 2
17:24: 1

終わりに

perlは慣れない人も多いかもしれませんが、非常に便利なツールでして、特にワンライナーで覚えた知識はperlスクリプトを解読するときにも応用できますので、非常にオススメです。

awkなどの場合、なかなかその知識が他に応用しにくいので、個人的にはperlで統一したほうが効率がいいと思ってしまうんですよね。他にRubyとかPythonで書く人もいるんだろうか。Pythonならデフォルトで入ってることが多いでしょうし。

また、障害対応のときに、さらっとワンライナー書けると、こいつデキると印象づけることができるような気がします。

今回紹介した以外にも、やろうと思えば、いくらでもできると思います。あとは、どこまでワンライナーでやるかはチームで相談しつつ、無理せずできればよいと思いますね。

是非便利ですので、使ってみてください!ではでは!