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

<前章までの状態>
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.txt を D:\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>
|
|