[シェル芸][awk]ディスク使用率をログっぽく一撃表示する


みなさんこんばんは。いっぱしのシェル芸人たるものawk力を高めなきゃ(使命感)!と尻に火がついた @nullpopopo でございます。今までは文字列の置換にsedを多用していたのですが、awkでフィールド切り出した後にsedで置換するのもカッコ悪い!パイプの本数は少なければ少ないほどよい!と思い立ったわけでして。

はい、正座して斉藤 博文さんの連載を読みました。ちょっととある事情から某所のディスク使用率を継続的に監視したくて、かつテキストでも残したかったので、こんな感じでログ出力するようにしました。

2014/11/22 00:00:00 / 5
2014/11/22 00:00:00 /dev/shm 0
2014/11/22 00:00:00 /boot 12

<日付> <時刻> <パーティション> <使用率> ってフォーマットですね。ちなみに元のdfはこんな感じで出力されます。

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       18G  784M   16G   5% /
tmpfs                 499M     0  499M   0% /dev/shm
/dev/vda1             477M   52M  400M  12% /boot

上記dfの結果から見出しの行を削除して、パーティションの列(最終フィールド)と使用率の列(5フィールド目)を抜き出し、単位の「%」を削除してdateコマンドの出力結果を先頭に加えています。これを実現するシェル芸ワンライナーはこちら。

df -P | egrep -v '^(Filesystem|ファイル)' | awk -v date="$(date "+%Y/%m/%d %H:%M:%S")" '{gsub(/%/, ""); print date,$NF,$5}'

dfコマンドのオプションですが、LVMな領域やNASの領域をマウントしている場合に折り返し表示をしないようにしています。ディスク使用率のパーセンテージさえ表示されればよいので他のオプションはつけていません。

次にdfの結果から見出しの行を削除しています。私はどんなサーバーを構築するときも英語環境にする(日本語をインストールしない)のがほとんどなのですが、手元のマシンが日本語環境のFedoraなので、LANGの設定を引き摺ったときでも見出し行が削除されるように、行頭が「Filesystem」と「ファイル」で始まる行を除いたものが出力されるようにしています。

最後にawkで変数の設定、置換、フィールドの切り出しをやっています。最初に「-v」オプションをつけることで、変数「date」にdateコマンドの出力結果をセットします。次に組み込み関数gsubで%を空文字に削除しています。そして最後にいつものprint文でawk変数「date」と最終フィールド($NF)と5フィールド目($5)を出力しています。

こうしてパイプを2本しか繋がずにdfの出力結果を加工することができました。ね、簡単でしょう?

斉藤さんの「シェル芸」に効く AWK処方箋はUSP Magazineで読めますよ!あ、私も恥ずかしながら隔月(偶数月)号で連載させていただいております(コッソリ)。

でわ〜(^o^)ノ♪