小さなツールをパイプを駆使して組み合わせるUNIX哲学。行指向のデータを効率良く処理する方法を知る物が勝者となる環境です。
対して本日紹介する「Awkward」は、行指向ではなくJavaScriptの配列を使ってデータを処理することができるユニークなシェルプログラムです。NodeJS製のツールで、npmを使用してインストールすることができます。
npm install -g awkward
Awkwardではシェルコマンドやその他実行ファイルの出力を、JavaScriptの配列として取り扱い、Arrayのmap、forEach、filterといったメソッドを適用することができます。
例えばpsを実行する場合、シェルの標準出力が、以下のような配列に変換されるのです。
シェル出力:
PID TTY TIME CMD 13750 pts/14 00:00:00 bash 25193 pts/14 00:00:03 node 25271 pts/14 00:00:00 sh 25272 pts/14 00:00:00 ps
配列:
[ [ 'PID', 'TTY', 'TIME', 'CMD' ], [ '13750', 'pts/14', '00:00:00', 'bash' ], [ '25193', 'pts/14', '00:00:03', 'node' ], [ '25283', 'pts/14', '00:00:00', 'sh' ], [ '25284', 'pts/14', '00:00:00', 'ps' ] ]
以下のように評価することで結果を自由に加工することができます。
(command).function((elem)=>{})
例えばlsを実行しファイル名とその長さを表示する場合、以下のようになります。
sora@awk ward:~$ ls().forEach(a => console.log(a[0], a[0].length)) Gemfile 7 Gemfile.lock 12 README.rdoc 11 Rakefile 8 app 3 bin 3 build.sh 8 config 6 config.ru 9 db 2 hello.sh 8 hello_parameter.sh 18 lib 3 log 3 out 3 public 6 rails41-bootstrap-demo.iml 26 test 4 tmp 3 untitled 8 vendor 6
ファイルサイズとファイル名を表示するのも簡単です。
sora@awk ward:~$ (ls -l)().forEach(a => console.log(a[4], a[8])) undefined undefined 1439 Gemfile 4045 Gemfile.lock 295 README.rdoc 249 Rakefile 306 app 170 bin 342 build.sh 374 config 154 config.ru 238 db 189 hello.sh 66 hello_parameter.sh 136 lib 204 log 102 out 238 public 38441 rails41-bootstrap-demo.iml 306 test 204 tmp 68 untitled 136 vendor
単体のシェルとしての機能自体はまだまだ不足気味ですが、新たなシェルのアイデアとして興味深いものとなっています。Hacker Newsでもアイデアの斬新さから、多くのコメントが寄せられています。awkやsedの奇妙な構文には我慢できないという方は試してみると新たな発見があるかもしれません。