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ならデフォルトで入ってることが多いでしょうし。
また、障害対応のときに、さらっとワンライナー書けると、こいつデキると印象づけることができるような気がします。
今回紹介した以外にも、やろうと思えば、いくらでもできると思います。あとは、どこまでワンライナーでやるかはチームで相談しつつ、無理せずできればよいと思いますね。
是非便利ですので、使ってみてください!ではでは!