16.パイプ 複数のコマンドを一度に実行する

前回の15.リダイレクト 入出力先を変更するでは、標準の入出力先をファイルに切り替えて、テキストファイルを読み込んだり、テキストファイルに書き込んだりしました。勘違いをしていけないのは、これは、テキストファイルを読み書きする機能ではなく、標準入出力(+エラー出力)を切り替える機能だということです。

さて、ここで「A」というコマンドで処理したテキストデータを「B」というコマンドさらに処理を加えたいとしたらどうすればいいでしょうか?

まず思いつくのが、「A」の処理結果をテキストで出力しておいて、次に「B」で保存したテキストデータを読み込んで処理をするという方法でしょうか?これなら前回のリダイレクトを使えばどうにかできそうです。

では、一度に「A」が処理した結果を、直接「B」が受け取って処理できないものでしょうか?これを実現するのがパイプ機能です。

パイプはコマンドAの出力をコマンドBの入力に接続します。蛇口にホースを繋いで、ホースの反対側をシャワーヘッドにつなぐイメージです。データはコマンドAの出力を出て、パイプを通り接続されたコマンドBの入力に渡されます。コマンドBは渡されたデータを元に新たに処理を開始します。これがパイプ機能の働く流れになります。

書式:コマンドA | コマンドB

コマンドA(必要なスイッチやオプションとともに) とコマンドB(こちらも同様)の間に半角スペースで区切って「|」パイプ記号を入力します。パイプ記号は一般的なJISキーボードならSHIFTキーを押しながら¥記号のキーを押します。USキーボードならSHIFTキーを押しながら\キーを押します。

パイプはコマンドAが標準出力へ出力したデータを、コマンドBの標準入力へ渡します。その後、コマンドBはその値を処理して標準出力へ実行した結果を出力します。今回の書式では2つのコマンドを接続していますが、この後パイプ記号を使うことで幾つでもコマンドを接続することができます。

注意するべき点は、コマンドAには出力するデータを持つコマンドを配置する必要があり、右側にはそのデータを受け取るための入力を持つコマンドを配置しなければいけない点です。

パイプ機能の例としては、大量のテキストを表示する場合。
DIRコマンドの/pオプションのような機能があれば便利ですが、必ずしもどのコマンドもこいったスイッチを持っているとは限りません。そういうときパイプ機能を使って、テキストデータをページごとに表示する「MORE」コマンドの入力としてDIRの出力を接続してやれば、1画面ごとにデータを分割して表示することができます。

例:
> dir /s | more

処理の流れとしては、まずDIRコマンドの標準出力がパイプの右側のMOREコマンドの標準入力となり、MOREコマンドで処理されたデータが標準出力であるディスプレイに表示される。

MOREコマンドのようにデータを受け取って再処理をすることのできるコマンドのことをフィルターコマンドなどと呼びます。以下にそのほかのフィルターコマンドを紹介します。

  • MORE テキストデータをページ分割して表示します。
  • FIND テキストデータ内から指定した文字列を検索する。
  • SORT テキストデータを行ごとに比較して行の並べ替えをする。

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA