コマンドの出力を調整する

あるコマンド、例えば my-script arg1 arg2 を実行すると

> my-script arg1 arg2
start step1
cp lib -> hoge
‘lib’ -> ‘hoge’
‘lib/File’ -> ‘hoge/File’
‘lib/File/Upload’ -> ‘hoge/File/Upload’
‘lib/File/Upload/AtomicChange.pm’ -> ‘hoge/File/Upload/AtomicChange.pm’
‘lib/File/Upload/Web’ -> ‘hoge/File/Upload/Web’
‘lib/File/Upload/Web/Dispatcher.pm’ -> ‘hoge/File/Upload/Web/Dispatcher.pm’
‘lib/File/Upload/Web/View.pm’ -> ‘hoge/File/Upload/Web/View.pm’
‘lib/File/Upload/Web/ViewFunctions.pm’ -> ‘hoge/File/Upload/Web/ViewFunctions.pm’
‘lib/File/Upload/Web.pm’ -> ‘hoge/File/Upload/Web.pm’
‘lib/File/Upload.pm’ -> ‘hoge/File/Upload.pm’
end step 1
start step 2
...
...
end step 2

のような出力がでるとする。

このとき

  • 画面への出力は特定の行だけで十分。上記の例だと /start step|end step/ の行。
  • ただしすべての出力は後々のためファイルに保存しておきたい。
  • ログ一行一行に時間が入っていた方が何かと便利。

を実現したくなったので custom-output というスクリプトを作ってみた。

これをかましてコマンドを実行すると、画面への出力は

> custom-output --append-time --logfile my.log --grep 'start step|end step' -- my-script arg1 arg2
[2014-07-13 01:51:05] start step1
[2014-07-13 01:51:05] end step 1
[2014-07-13 01:51:05] start step 2
[2014-07-13 01:51:05] end step 2

となる一方、my.log には

> cat my.log
[2014-07-13 01:51:05] out: start step1
[2014-07-13 01:51:05] out: cp lib -> hoge
[2014-07-13 01:51:05] err: ‘lib’ -> ‘hoge’
[2014-07-13 01:51:05] err: ‘lib/File’ -> ‘hoge/File’
[2014-07-13 01:51:05] err: ‘lib/File/Upload’ -> ‘hoge/File/Upload’
[2014-07-13 01:51:05] err: ‘lib/File/Upload/AtomicChange.pm’ -> ‘hoge/File/Upload/AtomicChange.pm’
[2014-07-13 01:51:05] err: ‘lib/File/Upload/Web’ -> ‘hoge/File/Upload/Web’
[2014-07-13 01:51:05] err: ‘lib/File/Upload/Web/Dispatcher.pm’ -> ‘hoge/File/Upload/Web/Dispatcher.pm’
[2014-07-13 01:51:05] err: ‘lib/File/Upload/Web/View.pm’ -> ‘hoge/File/Upload/Web/View.pm’
[2014-07-13 01:51:05] err: ‘lib/File/Upload/Web/ViewFunctions.pm’ -> ‘hoge/File/Upload/Web/ViewFunctions.pm’
[2014-07-13 01:51:05] err: ‘lib/File/Upload/Web.pm’ -> ‘hoge/File/Upload/Web.pm’
[2014-07-13 01:51:05] err: ‘lib/File/Upload.pm’ -> ‘hoge/File/Upload.pm’
[2014-07-13 01:51:05] out: end step 1
[2014-07-13 01:51:05] out: start step 2
[2014-07-13 01:51:05] out: ...
[2014-07-13 01:51:05] out: ...
[2014-07-13 01:51:05] out: end step 2

のように全部保存される。

既存のコマンドには手を加えないで、出力を調整できるので便利だと思う。