標準入出力とリダイレクト


●今まで,いろいろなコマンドを学習してきたが,UNIXでは,これらのコマンドを連携させて
 より高度な処理を簡単に行うことができる。ここでは,その強力な機能を提供する標準入出力
 という考え方と,リダイレクトという機能を解説する。 
  1. 前回のgrepの解説で使用したファイル 20101016gairon.txt を再び教材として利用する。

    さて,今までUNIXのコマンドの多くは,

     % コマンド名 ファイル名

    として,処理対象のファイルの名前を指定していた。しかし,more,less,sort,uniq,wc,cut,grep
    などのコマンドは,ファイル名を指定しない場合,標準入力(standard input)と呼ばれる特別な入力先
    からやってくるデータを読み込みこんで,そのデータを処理する。通常,標準入力はキーボードに設定
    されている


    では,実際にキーボードからデータを入力してみよう。例として,sortコマンドを使う。

     % sort

    というように,sortコマンドだけを入力する。すると,下図のようにキーボードからの入力を待って
    いる状態になる(下図)。

    この状態で,キーボードから
     456<改行>
     768<改行>
     123<改行>
    と入力して,続いて入力の終了を意味する Ctr-d (コントロールキーを押しながらd)を入力する。すると,
    入力が終了し,キーボードから入力された内容が整列されて表示される。


    この標準入力は,ユーザが自由に「ファイル」や「他のコマンドの実行結果」に割り当てることが出来る。
    たとえば,標準入力を特定のファイルに割り当てるには,< 記号を使って

     % コマンド名 < ファイル名

    とすると,指定したファイルの内容が標準入力を通してコマンドに渡され,コマンドはそのファイルの内容を
    処理してくれる。たとえば,

     % sort < 20101016gairon.txt

    としてみる(下図)。


    すると,ファイル20101016gairon.txtの内容を整列した結果を表示してくる(下図)。

    このように,標準入力元をキーボードや特定のファイルに切り替えることを,リダイレクト(redirect)と呼ぶ。

  2. 一方,コマンドの処理結果はktermの中に表示されていた。これも実は,コマンドは標準出力(standard output)
    という出力先に表示しているのである。そして,その標準出力は通常はktermのような端末ソフトの場面に結びつけ
    られているのである。
    この標準出力先を特定のファイルに結びつけることができる。つまり,標準出力の先もリダイレクトできるのである。
    方法は,> 記号を使って

     % コマンド名 > ファイル名

    とする。そうすると,処理結果は,指定されたファイルに書き込まれる。

    実際に,calコマンドで表示するカレンダーをファイルcale.txtに保存してみよう。

     % cal > cale.txt

    として,続いて,cale.txtの内容を表示したのが次図である。実際に,calコマンドの結果がファイルcale.txt
    に書き込まれていることがわかる。


    標準入力と標準出力を同時にリダイレクトすることもできる。

     % コマンド名 < 入力ファイル名 > 出力ファイル名

    とすることで,入力ファイルの内容をコマンドが処理した結果が,出力ファイルに書き込まれる。

  3. コマンドの出力結果を直接,他のコマンドに引き渡すことが出来る。そのために,| 記号(縦棒)を使用する
    (この記号はパイプと呼ばれる)。形式は

     % コマンド1 | コマンド2

    とすることで,コマンド1の結果がコマンド2に渡され,その結果が標準出力に出力される。もちろん,

     % コマンド1 | コマンド2 | コマンド3 | コマンド4

    というように,処理結果を次々と他のコマンドで処理していくことが出来る。

    ためしに,20101016gairon.txt を整列して,lessで表示してみよう。コマンドは

     % sort < 20101016gairon.txt | less

    となる。実行結果を次図に示す。

    このように,lessにコマンド出力をパイプすると,長い出力結果をゆっくり見ることが出来るので便利である。


    問題:「20101016gairon.txtで何人学生が出席しているか」を示すコマンドを書け。
    ヒント:grep,cut,sort,uniq,wcを使う。まずgrepで学生のIDを含む行だけ抜き出し,
        次にcutで第1フィールド(ID部分)を抜き出す。その結果をsortで整列する。すると
        同じIDの行が隣接するので,次にuniqコマンドで各IDの行を1行にまとめる。最後
        にwcで行をカウントする。