Subsections

2.4 パイプ

2.4.1 準備 -- 一時ファイルを使った複数コマンド処理

who コマンドを使うと,同じコンピュータを使っているユーザーの一覧が得られます。 who と wc を使ってコンピュータにログインしているユーザーの人数を調べてみましょう。

  1. まず,who コマンドを引数なしで実行し,どんな出力が得られるかを確 認してください。

    一行につき 1 ユーザーの情報が出力されますね。 who の出力から行数を求めれば,ログインしている延べユーザー数がわ かります。

  2. who コマンドの出力を,リダイレクトを使ってファイル user に保存します。
    who > user
    cat コマンド等で user の中身を確認してください。

  3. wc コマンドにオプション -l (エル) を指定して,ファイル user の行数を調べます。
    wc -l user
    ユーザー数がわかりましたね。

  4. ファイル user は不要になりましたので,削除してください。
    rm user
2. と 3. で行ったことを図にすると次のようになります。
\includegraphics*{12_who_wc.eps}

2.4.2 コマンドの連結 -- パイプ

あるコマンドの標準出力を,ファイルではなく,別のコマンドの標 準入力に直接接続することが可能です。その操作をパイプと呼びます。 パイプは,コマンド行において,一連のコマンドを「縦棒 (|)」で区切っ て記述することによって行います。パイプによって連結された一連のコマンドを パイプライン (pipeline) と言います。

なお,コマンドの標準出力と標準エラー出力の両方を次のコマンドの標準入力に 接続するには,tcsh の場合,| の代わりに |& とします。

例1: who と wc でログイン中のユーザー数を得る

前節の操作をパイプを使って行います。
who | wc -l
この状況を図示したのが次の図です。 パイプと共に wc を実行する場合, wc は標準入力 (stdin) から入力を受け取る必要がありますので, wc の引数にファイル名を指定してはいけません。
\includegraphics*{12_pipe_who_wc.eps}

例2: ls の出力を more で見る

一画面に収まらない ls の出力を more コマンドで 1 ページずつ見る例です。 ここでは /etc ディレクトリ内の全ファイルの詳細情報を ls コマンドで表示します。
ls -la /etc | more
more は引数にファイル名が与えられれば, そのファイルを直接読み込んで表示しますが, ファイル名を与えずにリダイレクトやパイプと共に用いると,標準入力から入力を受け取ります。 次の図では ls の引数 (-la /etc) の記述は省略しています。
\includegraphics*{4_pipe}
動作の概要は以下のとおりです。
  1. ls が実行結果を標準出力に出力します。

    ls の標準出力をパイプによって more の標準入力に接続しているので, ls の実行結果は画面には出力されません。

  2. more が ls の実行結果を標準入力から受け取り,標準出力を通じて画面 に表示します。
    1. more は,一画面分以上の入力を受け取ると対話的な動作をしま すので,一画面分の表示を終えたところで表示を止め,ユーザー からの命令を待っている状態になります。
    2. ユーザーがスペースキー等を押して全ページを表示させ終えるか, q 等を押すことで more を終了させると, パイプライン全体が終了し,プロンプト が帰ってきます。

2.4.3 パイプとリダイレクトの同時利用

次の例は,ls の出力を辞書順の逆順に並べ替えて表示します8
ls | sort -r
結果を画面ではなく,ファイル rlist に入れたければ
ls | sort -r > rlist
を実行します。このようにパイプと標準入出力のリダイレクトを同時に利用する ことが可能です。

2.4.4 コマンドの多段連結

command1 が標準出力 (stdout) に結果を出力するコマンドであり,command2command3 が標準入力 (stdin) から入力を読み取っ て結果を標準出力 (stdout) に出力するコマンドならば,
command1 | command2 | command3
により,次の図に示す多段のパイプが可能です。 これにより,command1 の出力が command2 で処理され,さらに command3 で処理されます。


\includegraphics*{4_multi_pipe}
なお,これまでと同様に,パイプラインの中の各コマンドには引数を与えること もできます。また,4つ以上のコマンドをパイプすることもできますし,その出 力をリダイレクトすることも可能です。

2.4.5 フィルタ

先の command2command3 のように,標準入力と標準出力を使っ た入出力が可能なコマンドをフィルタ (filter) といいます。フィルタは パイプラインの中で利用できるコマンドです。 この授業で紹介したコマンドでは
cat, grep, sort, wc
はフィルタです。 各コマンドの動作は man コマンド等で確認できます。