28.1 フィルタ

パイプを使うと, あるコマンドの出力を別のコマンドの入力とすることができます. パイプを使って, いくつかのコマンドを組み合わせて仕事をさせることにより, より複雑なことが一回の命令でできます.

たとえば, lastというコマンドを考えてみます. このコマンドは, 最近そのコンピュータにログインした人の名前を表示してくれます. しかし, 単に last と打つと, 恐らく多くの行が表示されて画面が流れていってしまいます. そのように出力が一画面に収まらないときは, more と組み合わせるとよいです. last の出力をパイプを使って more に送ることにより, more で出力を少しずつ見ることができます. 具体的には

promptlast | more return2

のようにします. 縦棒「|」でコマンドをつないでやることにより, 前のコマンドの出力が後ろのコマンドの入力となり, 組み合わせた仕事ができます.

普通は more というコマンドはパラメータとしてファイル名を指定して promptmore filename return2 のように使いますが, パイプのあとのコマンドとして使うときは, パラメータを書きません. ファイルから入力を読み込むのではなく, パイプの前のコマンドの出力が入力となるからです. 他のコマンドをパイプのあとに使う場合でも同様です.

last の出力から, g999999が含んだ行だけ取り出したいときは, lastgrep を組み合わせてやればできます. grep というコマンドは与えられたパラメータとパターンマッチした行だけ取り出すコマンドです. 詳しい使いかたはpromptman grep return2 してみてください.

promptlast | grep g999999 return2

別の例を考えてみます. たとえば, memo.txt という名前のJISコードで書かれたテキストファイルをプリンタに出力するということを考えてみましょう. まず, nkfで漢字コードを日本語EUCに変換して, その出力をPostScriptに変換する必要があります. そのようなときにはパイプを利用して, コマンドを連結してやるとよいです.

具体的には, 以下のようにします. memo.txt というJISコードで書かれたファイルをnkfというコマンドで日本語EUCに変換してから, a2ps というコマンドでPostScriptファイルに変換して, その出力をlprでプリンタに出してやればよいです. a2ps というのは, 日本語のテキストファイルをPostScriptファイルに変換するプログラムです.

promptnkf -e memo.txt | a2ps | lpr return2

この場合の a2ps のように, 途中にはさまれて, 入力を変換して次に渡すようなプログラムをフィルタといいます.(実際には,教育用計算機システムにインストールされているa2psは,自動的に漢字コードを日本語EUCに変換してくれるので,prompta2ps memo.txt | lpr return2 とすれば印刷できます.)

いくつか実用的な例を示します.

file.ps というPostScriptファイルについて, 2ページを1ページにまとめる形でプリントします.

promptpsnup -2 file.ps | lpr return2

log.txt というファイルの g999999 が含まれる行の数を出力します.なお,wcというのは行数やバイト数を数えるコマンドです.

promptgrep g999999 log.txt | wc return2

最近のそのサーバへのログイン記録の中から g999999 が含まれる行のみを出力します.

promptlast | grep g999999 return2

caution

ここでの説明は,bashだけでなくほとんど全てのコマンドラインシェルに当てはまります.