# 俺のワンライナー改め CLI ツール群のステマ {{tag: perl, cli}} このエントリーは [[http://qiita.com/advent-calendar/2015/perl5 Perl 5 Advent Calender 2015]] の3日目の記事です。 ## まだワンライナーで消耗してるの? Perl で書くワンライナーが便利というのはもうさんざん語られている気がするし自明だろうて、このたびはコマンドラインインターフェースで便利なツール群をドヤ顔でステマしたいと思います。怠惰ゆえ、もうワンライナー書くのも面倒になったらコマンドにしてしまえこのやろう、というノリですぜ、おとっつあん。 手前みそですが、できる限り便利そうなやつをピックアップするので、ひとつお付き合いください。ペコリ。 ### swoop まずは {{cpan: Statistics::Swoop}} をインストールすると付いてくる {{cpan: swoop}} コマンド。これは、ログのあるカラムの合計、最大、最小、レンジ、平均をさくっと算出してくれるコマンド。 $ cat log_file | swoop -f3 -d, .--------------------------------------------. | | elem | sum | max | min | range | avg | +---+------+------+-----+-----+-------+------+ | 3 | 10 | 55 | 10 | 1 | 9 | 5.5 | '---+------+------+-----+-----+-------+------' オプションは `cut` コマンドと同じ感じ。 ### yg 次は {{cpan: App::YG}} に付いてくる {{cpan: yg}} コマンド。これは MySQL の `\G` のごとく、ログファイルをバーティカル表示できるようにしてやろうというコマンド。[[http://perl-users.jp/articles/advent-calendar/2012/hacker/7 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 つづきましては {{cpan: App::FromUnixtime}} の {{cpan: 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 {{cpan: App::Randf}} の {{cpan: randf}} は、ものすごい流量のログを一定確率でフィルタして目grepに耐えるようにできるやつ。元ネタは [[http://yapcasia.org/2015/talk/show/39a72c04-10e3-11e5-b8ab-d7f07d574c3a YAPC::Asia 2015 の Perlワンライナー入門]] で語られていたのをコマンドに落とし込んでみた次第。 $ tail -f high_flow_log | randf 10 これで 1/10 ログになる。滝のように流れるエラーログとかからだに良くないですからね。 ### edumper {{cpan: Data::Dumper}} を利用してデバッグ出力することは多いと思うのですが、マルチバイトな文字列が Perl の内部表現でエスケープされて読めない悲しみを味わっていることも多いと思われます。そうした事態に対処する {{cpan: 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 最後は {{cpan: Text::Chord::Piano}} に同梱されている {{cpan: piano_chord}} です。いっしょうけんめいコーディングをしているとき、ふとした瞬間に「ピアノで C#augM7 ってどうおさえるんだっけ?」 と疑問に思い始めることってありますよね? そんなとき、めっぽう役立つコマンドです。 $ piano_chord C#augM7 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |*| | | | | | | | | | | | | | | | | | | | | | | | |_| |_| | |_| |_| |_| | |_| |_| | |_| |_| |_| | | | | | | | | | | | | | | | | | | | | * | | * | | * | | | | | | | |___|___|___|___|___|___|___|___|___|___|___|___|___|___| C#augM7 No Music, No Code. ## CLI コマンドの勘所 さて、ここまでステマでやってきましたが、いかがだったでしょうか。ワンライナーもいいけど、小さなコマンドラインツールを揃えておくのも再利用性の面で Good です。そういうわけで、ここからは、私が CLI ツールを書くのに利用している便利すぎるモジュールをいくつかあげてみます。ここからはステマではありませんYO! ### Getopt::Long & Pod::Usage {{cpan: Getopt::Long}} はいわずと知れたコマンドラインオプションをパーズしてくれるデファクト。{{cpan: Pod::Usage}} は Pod にかかれたマニュアルを、使い方として表示するためのモジュール。この二つは CLIツールを書く上で必須ですね。 ### Config::CmdRC コマンドラインツールの設定ファイルは .foorc という rc ファイルなるものに書くのが常だとおばあちゃんから習っていると思いますが、その rc ファイルを探索して読んでパースしてくれるのが {{cpan: Config::CmdRC}} です。 use Config::CmdRC '.foorc' たったこれだけで、`.` `$ENV{CMDRC_DIR}` `$ENV{HOME}` `/etc` を順に探索して .foorc ファイルを読んで `RC()` という関数で参照できるようになる。 ### IO::Interactive::Tiny {{cpan: 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 = ) { ## $line なんかする } } つまり、`-t STDIN` だよ。テヘペロ。 ### App::FatPacker::Simple {{cpan: App::FatPacker::Simple}} の {{cpan: fatpack-simple}} は、コマンドの依存関係をまとめて 1ファイルにしてくれる。依存のすべてが Pure Perl (非XS) という縛りがでるが、依存モジュールをインストールしないと使えないというマイナス面をなくしてくれる。cpan コマンドでモジュールを入れることができなくても、fatpack されたファイルをもってくれば利用できるようになる。 ちなみに、fatpack したファイルはモジュールのディストリビューションの最上位に配置して MANIFEST には含めず github あたりから raw コード落としてもらう、というのがよさげ。 ## まとめ ワンライナーもいいけど、CLI で役立つツール書くのもおすすめ! 以上、俺のワンライナー改め CLI ツール群のステマ(一部除く)でした! 明日は {{tw: fujiwara}} さんです! [[http://qiita.com/advent-calendar/2015/perl5 Perl 5 Advent Calendar 2015]] はまだまだ参加者募集中!!