パイプを使うと, あるコマンドの出力を別のコマンドの入力とすることができます. パイプを使って, いくつかのコマンドを組み合わせて仕事をさせることにより, より複雑なことが一回の命令でできます.
たとえば, lastというコマンドを考えてみます. このコマンドは, 最近そのコンピュータにログインした人の名前を表示してくれます. しかし, 単に last と打つと, 恐らく多くの行が表示されて画面が流れていってしまいます. そのように出力が一画面に収まらないときは, more と組み合わせるとよいです. last の出力をパイプを使って more に送ることにより, more で出力を少しずつ見ることができます. 具体的には
last | more
のようにします. 縦棒「|」でコマンドをつないでやることにより, 前のコマンドの出力が後ろのコマンドの入力となり, 組み合わせた仕事ができます.
普通は more というコマンドはパラメータとしてファイル名を指定して more filename のように使いますが, パイプのあとのコマンドとして使うときは, パラメータを書きません. ファイルから入力を読み込むのではなく, パイプの前のコマンドの出力が入力となるからです. 他のコマンドをパイプのあとに使う場合でも同様です.
last の出力から, g999999が含んだ行だけ取り出したいときは, last と grep を組み合わせてやればできます. grep というコマンドは与えられたパラメータとパターンマッチした行だけ取り出すコマンドです. 詳しい使いかたはman grep してみてください.
last | grep g999999
別の例を考えてみます. たとえば, memo.txt という名前のJISコードで書かれたテキストファイルをプリンタに出力するということを考えてみましょう. まず, nkfで漢字コードを日本語EUCに変換して, その出力をPostScriptに変換する必要があります. そのようなときにはパイプを利用して, コマンドを連結してやるとよいです.
具体的には, 以下のようにします. memo.txt というJISコードで書かれたファイルをnkfというコマンドで日本語EUCに変換してから, a2ps というコマンドでPostScriptファイルに変換して, その出力をlprでプリンタに出してやればよいです. a2ps というのは, 日本語のテキストファイルをPostScriptファイルに変換するプログラムです.
nkf -e memo.txt | a2ps | lpr
この場合の a2ps のように, 途中にはさまれて, 入力を変換して次に渡すようなプログラムをフィルタといいます.(実際には,教育用計算機システムにインストールされているa2psは,自動的に漢字コードを日本語EUCに変換してくれるので,a2ps memo.txt | lpr とすれば印刷できます.)
いくつか実用的な例を示します.
file.ps というPostScriptファイルについて, 2ページを1ページにまとめる形でプリントします.
psnup -2 file.ps | lpr
log.txt というファイルの g999999 が含まれる行の数を出力します.なお,wcというのは行数やバイト数を数えるコマンドです.
grep g999999 log.txt | wc
最近のそのサーバへのログイン記録の中から g999999 が含まれる行のみを出力します.
last | grep g999999
ここでの説明は,bashだけでなくほとんど全てのコマンドラインシェルに当てはまります.
28. シェルの活用 | 28.1 フィルタ | 28.2 リダイレクション | ||
2009年度版に向けて現在作業中です.
このページに関してお気づきの点がありましたら
コメント投稿システムまでお願いします.
|
Sun, 31 Jul 2005 11:25:37 JST (1461d) |