Awkことはじめ

written by がいすと

6.2 ファイル情報のみを抽出する

次に、それぞれの中身を見てみましょう。中身はdirコマンドの結果ですから、たとえば以下のように格納されています。


 ドライブ C: のボリュームラベルは  SYSTEM
 ボリュームシリアル番号は 0B72-1703
 フォルダは C:\temp

.              <DIR>        99-10-11  18:48 .
..             <DIR>        99-10-11  18:48 ..
DT0304E1 MID        65,713  99-02-27   1:31 Dt0304e1.mid
ZEPHYR~1 HTM         2,970  99-09-11  14:11 Zephyr Project Web Page.htm
C,C__~1 FIL   <DIR>        99-10-11  18:51 C,C++.files
C,C__~1 HTM         7,199  99-10-03  23:21 C,C++.htm
TEST                   256  99-10-11  19:11 Test
TEST     256           256  99-10-11  19:15 Test.256
         5 個             76,394 バイトのファイルがあります.
         3 フォルダ      2,127.45 メガバイトの空きがあります.

このファイルには様々な情報が入っていますから、ここからファイルの情報が書かれている行だけを抽出する方法を考えてみましょう。抽出した情報から、後で処理しやすい形にして出力したいと思います。

項の数に注目すると下のようになります。すると、ファイルの情報やフォルダの情報が書かれている行の項は5個以上であるのに対し、それ以外の行は3個以下であることがわかります。従ってファイルとフォルダの情報が入っている行だけを取り出す条件は、「行の項数が5個以上」となります。それぞれの行の項数は、NFという変数に入っているので、これを使います。

次に、フォルダとファイルの情報の行を分けることを考えます。2つの情報の違いは、ファイルのサイズを示す項が<DIR>という文字か、数字が入っているかです。この違いをチェックするには、項が2項の場合と3項の場合があるので、少し工夫が必要です。ここで、「"<"、">"という文字はファイル名には使えない」という規則を考慮すれば、ファイルの情報の入っている行には<DIR>という文字列は含まれないことがわかります。従って、行全体を表す$0を使えば、項の数が違っていても調べることができます。

以上より、ファイルの情報が入っている行だけを書き出すプログラムは、以下のように書くことができます。


NF >= 5 && $0 !~ /<DIR>/

[文字列変数] ~ /パターン/ は、その文字列変数にパターンで示される文字列が含まれるかどうかを表し、!~はその否定です。ですから $0 !~ /<DIR>/とは、その行が<DIR>という文字列を含まないどうかを表しています。このパターンは「正規表現」と呼ばれるものです。詳細については様々な参考書を見てください。

実行結果は、以下のようになります。


DT0304E1 MID        65,713  99-02-27   1:31 Dt0304e1.mid
ZEPHYR~1 HTM         2,970  99-09-11  14:11 Zephyr Project Web Page.htm
C,C__~1 HTM         7,199  99-10-03  23:21 C,C++.htm
TEST                   256  99-10-11  19:11 Test
TEST     256           256  99-10-11  19:15 Test.256