●今まで,いろいろなコマンドを学習してきたが,UNIXでは,これらのコマンドを連携させて
より高度な処理を簡単に行うことができる。ここでは,その強力な機能を提供する標準入出力
という考え方と,リダイレクトという機能を解説する。
- 前回の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)と呼ぶ。
- 一方,コマンドの処理結果はktermの中に表示されていた。これも実は,コマンドは標準出力(standard output)
という出力先に表示しているのである。そして,その標準出力は通常はktermのような端末ソフトの場面に結びつけ
られているのである。
この標準出力先を特定のファイルに結びつけることができる。つまり,標準出力の先もリダイレクトできるのである。
方法は,> 記号を使って
% コマンド名 > ファイル名
とする。そうすると,処理結果は,指定されたファイルに書き込まれる。
実際に,calコマンドで表示するカレンダーをファイルcale.txtに保存してみよう。
% cal > cale.txt
として,続いて,cale.txtの内容を表示したのが次図である。実際に,calコマンドの結果がファイルcale.txt
に書き込まれていることがわかる。
標準入力と標準出力を同時にリダイレクトすることもできる。
% コマンド名 < 入力ファイル名 > 出力ファイル名
とすることで,入力ファイルの内容をコマンドが処理した結果が,出力ファイルに書き込まれる。
- コマンドの出力結果を直接,他のコマンドに引き渡すことが出来る。そのために,| 記号(縦棒)を使用する
(この記号はパイプと呼ばれる)。形式は
% コマンド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で行をカウントする。