俺のワンライナー改め CLI ツール群のステマ
このエントリーは Perl 5 Advent Calender 2015 の3日目の記事です。
まだワンライナーで消耗してるの?
Perl で書くワンライナーが便利というのはもうさんざん語られている気がするし自明だろうて、このたびはコマンドラインインターフェースで便利なツール群をドヤ顔でステマしたいと思います。怠惰ゆえ、もうワンライナー書くのも面倒になったらコマンドにしてしまえこのやろう、というノリですぜ、おとっつあん。
手前みそですが、できる限り便利そうなやつをピックアップするので、ひとつお付き合いください。ペコリ。
swoop
まずは Statistics::Swoop をインストールすると付いてくる swoop コマンド。これは、ログのあるカラムの合計、最大、最小、レンジ、平均をさくっと算出してくれるコマンド。
$ cat log_file | swoop -f3 -d,
.--------------------------------------------.
| | elem | sum | max | min | range | avg |
+---+------+------+-----+-----+-------+------+
| 3 | 10 | 55 | 10 | 1 | 9 | 5.5 |
'---+------+------+-----+-----+-------+------'
オプションは cut
コマンドと同じ感じ。
yg
次は App::YG に付いてくる yg コマンド。これは MySQL の \G
のごとく、ログファイルをバーティカル表示できるようにしてやろうというコマンド。2012 年の perl advent calender でも書いたことがある。
$ yg apache_log
******************** 1 ********************
Host: 127.0.0.1
Ident: -
Authuser: -
Date: 30/Sep/2015:12:34:56 +0900
Request: GET /foo HTTP/1.0
Status: 200
Bytes: 123
Referer: http://example.com/foo
UserAgent: Mozilla/5.0
おっさんの目にも優しい感じで、LTSV ファイルもいける。
$ yg --ltsv path/to/ltsv
******************** 1 ********************
time: 08/Feb/2015
host: 192.168.0.1
req: GET / HTTP/1.1
status: 200
pipe で受け取ることもできる。
$ cat path/to/ltsv | yg --ltsv
******************** 1 ********************
time: 08/Feb/2015
host: 192.168.0.1
req: GET / HTTP/1.1
status: 200
from_unixtime
つづきましては App::FromUnixtime の from_unixtime。これは、標準出力に含まれる unixtime っぽいものにヒューマンリーダブルな日付を差し込んでくれる。
$ cat sql_result
id 1
value 1419702037
created_at 1419702037
updated_at 1419702037
$ cat sql_result | from_unixtime
id 1
value 1419702037
created_at 1419702037(Sun, 28 Dec 2014 02:40:37 +0900)
updated_at 1419702037(Sun, 28 Dec 2014 02:40:37 +0900)
unixtimeまみれの人におすすめ!
randf
App::Randf の randf は、ものすごい流量のログを一定確率でフィルタして目grepに耐えるようにできるやつ。元ネタは YAPC::Asia 2015 の Perlワンライナー入門 で語られていたのをコマンドに落とし込んでみた次第。
$ tail -f high_flow_log | randf 10
これで 1/10 ログになる。滝のように流れるエラーログとかからだに良くないですからね。
edumper
Data::Dumper を利用してデバッグ出力することは多いと思うのですが、マルチバイトな文字列が Perl の内部表現でエスケープされて読めない悲しみを味わっていることも多いと思われます。そうした事態に対処する Data::Dumper::AutoEncode というモジュールがあり、同梱されている edumper
は CLI で使えます。
ふつうに Data::Dumper でエスケープされたマルチバイト
$ perl hoge.pl
$VAR1 = {
"\x{7d05}\x{767d}" => "\x{6b4c}\x{5408}\x{6226}"
};
上のように読めないのを edumper に渡すと、
$ perl hoge.pl | edumper
$VAR1 = {
"紅白" => "歌合戦"
};
乃木坂46!!!
piano_chord
最後は Text::Chord::Piano に同梱されている piano_chord です。いっしょうけんめいコーディングをしているとき、ふとした瞬間に「ピアノで C#augM7 ってどうおさえるんだっけ?」 と疑問に思い始めることってありますよね? そんなとき、めっぽう役立つコマンドです。
$ piano_chord C#augM7
| | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | |
| |*| | | | | | | | | | | | | | | | | | | | | | |
| |_| |_| | |_| |_| |_| | |_| |_| | |_| |_| |_| |
| | | | | | | | | | | | | | |
| | | | * | | * | | * | | | | | | |
|___|___|___|___|___|___|___|___|___|___|___|___|___|___|
C#augM7
No Music, No Code.
CLI コマンドの勘所
さて、ここまでステマでやってきましたが、いかがだったでしょうか。ワンライナーもいいけど、小さなコマンドラインツールを揃えておくのも再利用性の面で Good です。そういうわけで、ここからは、私が CLI ツールを書くのに利用している便利すぎるモジュールをいくつかあげてみます。ここからはステマではありませんYO!
Getopt::Long & Pod::Usage
Getopt::Long はいわずと知れたコマンドラインオプションをパーズしてくれるデファクト。Pod::Usage は Pod にかかれたマニュアルを、使い方として表示するためのモジュール。この二つは CLIツールを書く上で必須ですね。
Config::CmdRC
コマンドラインツールの設定ファイルは .foorc という rc ファイルなるものに書くのが常だとおばあちゃんから習っていると思いますが、その rc ファイルを探索して読んでパースしてくれるのが Config::CmdRC です。
use Config::CmdRC '.foorc'
たったこれだけで、.
$ENV{CMDRC_DIR}
$ENV{HOME}
/etc
を順に探索して .foorc ファイルを読んで RC()
という関数で参照できるようになる。
IO::Interactive::Tiny
IO::Interactive::Tiny を使うと、標準入力を受けているかどうか判別できる。
$ some_cmd FILE
ってのと
$ cat FILE | some_cmd
を判別できる。
use IO::Interactive::Tiny;
if ( IO::Interactive::Tiny::is_interactive(*STDIN) ) {
## なんかする
}
else {
while ( my $line = <STDIN> ) {
## $line なんかする
}
}
つまり、-t STDIN
だよ。テヘペロ。
App::FatPacker::Simple
App::FatPacker::Simple の fatpack-simple は、コマンドの依存関係をまとめて 1ファイルにしてくれる。依存のすべてが Pure Perl (非XS) という縛りがでるが、依存モジュールをインストールしないと使えないというマイナス面をなくしてくれる。cpan コマンドでモジュールを入れることができなくても、fatpack されたファイルをもってくれば利用できるようになる。
ちなみに、fatpack したファイルはモジュールのディストリビューションの最上位に配置して MANIFEST には含めず github あたりから raw コード落としてもらう、というのがよさげ。
まとめ
ワンライナーもいいけど、CLI で役立つツール書くのもおすすめ!
以上、俺のワンライナー改め CLI ツール群のステマ(一部除く)でした!
明日は @fujiwara さんです!
Perl 5 Advent Calendar 2015 はまだまだ参加者募集中!!