こんにちは!、chibaです!
この記事はアクトインディ Advent Calendar 2016 10日目です。
さて前回最強のスクリプティング言語を導入しましたが、早速スクリプトを書いてみましょう。
今回お題とするのは、df
の出力をシンプルにし、カラムを好きな順番に並べ変えたものです。
これまでのUnixシェルスクリプトでは、こんな感じに書いていました。
#!/bin/sh
df -lh -x tmpfs |awk '{printf("%2d%%%6s %s\n",$(NF-1),$(NF-2),$NF)}'|tail -n +2|sort -nr
一行野郎がそのままスクリプトになってしまった感じですね。
出力はこんな感じです。
69% 30G /foo
58% 7.5G /
53% 46G /bar
48% 271G /baz
39% 1.6T /quux
33% 150G /zop
26% 650G /
10% 85G /zot
1% 7.7G /dev
ディスクの空き容量を適当に観察したいなと思って作りました。
awk
や、tail
、sort
のコマンドの知識が要求されるのが辛いですね。
1970-80年代の知識を蓄えるのつらい……。
さてこれを輝ける未来のPerl6で書いてみました。
#!/usr/bin/env perl6
my @df = qx/df -lh -x tmpfs/.lines[1..Inf];
my @ans = @df.map({ my ($,$,$,$left,$pct,$dir) = .words;
[$pct.chop.Int,$left,$dir] })
.sort({$^a[0] < $^b[0]});
for @ans -> ($pct,$left,$dir) {
printf("%3d%% %4s %s\n",$pct,$left,$dir);
}
$
や、<
、^
等尖った記号が多くて若干茨のような見た目になっていますね。
もっと短くは書けると思いますが、圧縮して書いても良いことなさそうなのでやめました。
解説をすると、q:x//
(qx
とも書ける)でコマンドを実行した結果を取得できるので、その結果をlines
で分解し、2行目以降を配列とします。
次にmap
でそれを加工し、sort
でソートします。
ソートは数値で行う必要があるので、chop
で%を取って.Int
で整数に変換しています。
そして最後にfor
で配列を回してprintf
で整形して表示する、といった具合です。
自分は、バックグラウンドがLispなものでmapしがちなのですが、そんなmap野郎でもお手軽に扱えて嬉しいです。
そんな訳で、来年は未来の言語(Perl6)を活用していきたいです!