アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

最強のインフラ用スクリプト言語を探す旅にでます(其の二)

こんにちは!、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や、tailsortのコマンドの知識が要求されるのが辛いですね。
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)を活用していきたいです!