9. パイプ処理(フィルタコマンド) 

   9−1  フィルタコマンド
   9−2  パイプ
   9−3  リダイレクトとパイプの併用

<前章までの状態>

 D:ドライブに test ディレクトリがあります。
 D:\ にバッチファイル test.bat があります。
 D:\test ディレクトリの中
   ディレクトリ renshu
   テキストファイル all.txt, list, test.txt, test2.txt, test3.txt
   バッチファイル of.bat
 D:\
 ├test.bat
 └test
   ├ all.txt
   ├ list
   ├ renshu
   ├ of.bat
   ├ test.txt
   ├ test2.txt
   └ test3.txt

9−1  フィルタコマンド

ほとんどのコマンドは、実行にあたって標準入力からの入力を必要としていません。 コマンド実行後に私達がキーボードから何かを入力するのは、 DEL *.* の 確認に対する「y/n」であったり、 PAUSE に対して何かキーを押す時くらい のものです。
ところが、いくつかのコマンドは、標準入力からの入力を加工して標準出力へ書き 出すのをメインの機能とするものがあり、そうしたコマンド類をフィルタ コマンドといいます。
標準入力
−入力文字列→
 フィルタ 
−加工された文字列→
標準出力

フィルタコマンドの代表格は SORT です。まずは、テキストファイル名を 引数にとった場合の SORT の働き方は、以下の通りです。
前章で作成した list を文字コード順に並べ替えて画面表示してみます。

SORT ファイル名 (ファイルの内容を行単位でソートします)

 D:\test>type list
 all.txt      ↓↓ list の中身を表示しています ↓↓
 list
 of.bat
 renshu
 test.txt
 test2.txt
 test3.txt
 all.txt
 list
 renshu
 of.bat
 test.txt
 test2.txt
 test3.txt

 D:\test>sort list ← list をソートします
 all.txt      ↓↓ list の中身をソートして表示しています ↓↓
 all.txt
 list
 list
 of.bat
 of.bat
 renshu
 renshu
 test.txt
 test.txt
 test2.txt
 test2.txt
 test3.txt
 test3.txt

 D:\test>


このコマンドは、ファイル名 が省略された場合、標準入力からの入力を 行単位で並べ替えます。標準入力は、通常、キーボードからのキー入力です。
入力終了には、[CTRL]+[Z]キーを押して下さい。
(画面上では ^Z と表示されますが、[^]と[Z]を入力したのではありません)

SORT (標準入力の内容を行単位でソートします)

 D:\test>sort (← 標準入力をソートします)
 dog
 cat
 bear
 cow
 ^Z      ← ここまでがキー入力(標準入力)です
 bear   ---↓↓ 入力がソートされて(標準出力に)出力されました ↓↓
 cat
 cow
 dog

 D:\test>


ソートされた結果を保存しましょう。
出力のリダイレクトを使って、D:\test\list の中身を書き換えます。

 D:\test>sort > list
 dog
 cat
 bear
 fox
 cow
 ^Z      ← ここまでがキー入力(標準入力)です
                     ← ソート結果は list に書き込まれています…
 D:\test>

list の中身を確認してみましょう。

 D:\test>type list
 bear                ← 入力がソートされて list に格納されています
 cat
 cow
 dog
 fox

 D:\test>


先ほどの list から、文字 "o" を検索します。 テキストファイル(単一のファイルまたは複数ファイルのファイルリスト)から、 特定の文字を含む行を検索するコマンド FIND があります。

FIND "検索文字列" ファイルリスト
(ファイル名にワイルドカード可。検索文字列を含む行だけ出力します)

 D:\test>find "o" list ← "o" を検索します

 ---------- LIST     ← list の中のデータだ、という表示
 cow
 dog
 fox       ← "o" を含む行が3行ありました

 D:\test>


これもフィルタコマンドなので、ファイルリストを省略すれば、標準入力(通常はキー入力)を 受け付けます。

 D:\test>find "o"     ← キー入力の中の"o"を検索します
 dog
 dog          ← 検索されたので出力、つまり表示
 cat
 bear
 fox
 fox          ← 検索されたので表示
 cow
 cow          ← 検索されたので表示
 ^Z         ← キー入力終了

 D:\test>


これだけでは何の意味もないようですが、フィルタコマンドは「パイプ」機能と 組み合わせることによって、非常に便利なコマンドであることが理解されます。


9−2  パイプ

あるコマンドの標準出力を、別のコマンド(フィルタコマンド)の標準入力へ直接流し込む機能を 「パイプ」と呼びます。

コマンド | フィルタコマンド   ( | は、[shift]+[\] を押します)

コマンド
─出力→|─入力→
フィルタ
─加工された文字列→
標準出力
└― パイプ ―┘

下のような文字列をもったテキストファイル 12.txtD:\test に作成します。
12.txt−メモ帳
ファイル(F) 編集(E) 書式(O) ヘルプ(H)
 mouse
 cow
 tiger
 rabbit
 dragon
 snake
 horse
 sheep
 monkey
 hen
 dog
 boar


このファイルに対して、以下の処理を行います。
(1) "g" を含む行だけ抜き出し、
(2) その各行をコード順に並べ替え、標準出力(画面)に出力。

 D:\test>find "g" 12.txt   ← "g"を検索する (1) だけ実行

 ---------- 12.TXT
 tiger
 dragon              ← "g"を含む行が出力されています
 dog

 D:\test>find "g" 12.txt | sort   ← パイプ処理で (1)〜(2)

 ---------- 12.TXT
 dog
 dragon              ← コード順に出力されました
 tiger

 D:\test>


パイプは多重に連結することも可能です。下の例では、
(1) DIR の出力の中から、
(2) FIND "2002/03/" で "2002/03/" を含む行だけを抜き出し、
   (実際に検索できそうな日付で実行してみて下さい)
(3) SORT で並べ替えて出力します。
つまり、2002年3月に更新されたファイルについての日付順のリストが出来上がります。 日付の文字列を変えてみたり、dir の部分を dir c:\ にするなど、 いろいろ試してみて下さい。
(下の DIR の出力形式は Windows2000 のコマンドプロンプトのものです)

 D:\test>dir | find "2002/03/" | sort

 2002/03/05  20:11                   42 test2.txt
 2002/03/21  11:42                   42 test3.txt
 2002/03/28  01:36                    1 all.txt

 D:\test>



9−3  リダイレクトとパイプの併用

パイプ処理でフィルタコマンドから出力された文字列をリダイレクトし、ファイルに 保存することができます。ちょっと目で確認、といった操作を超えてのまとまった テキスト処理をするには、よく使われる組み合わせです。

 D:\test>dir | find "2002/03/" | sort > list
                    ← 結果は画面でなく、list に出力されました
 D:\test>