情報処理概論目次

パイプとフィルタ

入出力のリダイレクションと並んで,パイプさせて目的を達するためにコマンドを組み合わせて処理を行なうことは,UNIXの利用において最重要の技法である.

脱落しないように,自分で考えて確かめながら,しっかり理解すること. ここで引き離されると,今後の挽回は難しい. 最後のチャンスである.


このページのテキスト版(LaTeX文書)があるので,印刷にはこれを使うこと. 情報処理の考え方を解説したテキストもよく理解しておくこと.

パイプ

UNIXの情報処理に関わるコマンドの多くは,標準入力から情報を受け取り標準出力に結果を返している.
       標準入力装置             標準出力装置
入力 ---------------> コマンド  --------------->  出力
こうしたコマンドを組み合わせて.あるコマンドcommand1の処理結果(標準出力装置への出力)を別のコマンドcommand2の入力に"繋ぎ換える"ことをパイプ(pipe)という.
     標準入力装置           標準出力   標準入力            標準出力装置
入力 ------------> command1 -------> | --------> command2 ----------->  出力
コマンドを連ねてパイプするには縦棒記号『|』を使う. UNIXではパイプを実現しているのはシェルのパイプ機能による.

DVIファイルの印刷

我々は既に次のパイプ処理を知っている.
% jdvi2kps report.dvi | lpr
これは,次の処理を続けて行なっていることに相当する.
  1. コマンドjdvi2kpsはLaTeXで生成されたDVIファイルを入力すると,それをPostscriptコードに変換して標準出力の返すPSドライバーである. jdvi2kpsによってPostscriptコードに変換された出力をlprの標準入力にパイプしている.

  2. コマンドlprは標準入力から受け取った内容をプリンタ装置に送り出す. パイプによって入力されたPostscriptコードがlprによってプリンタに送られる.
本学のUNIXに接続されているプリンタはPostscriptプリンタである. Postscriptプリンタはきわめて強力で,本学のパソコン教室にあるプリンタよりもはるかに美しくグレースケールを含んだ写真やイラストなどを印刷することができる. ただし,プリンタに入力されるデータはPostscriptコードでなければならない.

上のようにパイプ処理を経ないてプリンタに印刷するには,次のようにリダイレクションによってPostscriptファイルを作成し,これを改めてlprに渡してやる.

% jdvi2kps report.dvi > report.ps
% lpr report.ps
ファイルの種類を表すために,拡張を必ず付けねばならないことに注意する. Postscriptファイルの拡張子は,通常『.ps』である(場合によっては,『.eps』も使う).

演習1:DVIファイルをパイプを使わないで印刷してみよ.

フィルター

UNIXでは,標準入力装置から(実際には,リダイレクトによってテキストファイルから)入力されたテキストを``加工して''標準出力装置に出力するコマンドを特にフィルタ(filter)という. フィルタをパイプを使って組み合わせることによって,コマンドの結果やファイル内容を選択的に抽出したりすることができる.
cat
ファイル内容を表示するコマンドとして既に使ってきた.
% cat file1 file2 file3 ....
として,ファイルfile1file2file3,...の内容をつなげて(連接して)表示することができる.
% ls | cat
  と
% ls
は同じ結果をもたらす.

nkf
漢字コードを変換するフィルタで,既にリテラシーで学んでいる. ファイルfileをシフトJIS(Windows95やMacintoshの漢字コード)に変換して,その結果をファイルsjisに書き出すには次のようにする.
% nkf -s file > sjis
   または
% cat file | nkf -s > sjis

漢字コードフィルタnkfのオプション
オプション 意味
-j JIS漢字コードに変換
-e EUC漢字コードに変換
-s シフトJISコードに変換

演習2:シフトJIS漢字コードで書かれたテキストファイルsjis.txtの内容をPostscriptプリンタに印刷するにはどうするか.

テキストファイルの印刷
DVIファイルでない通常のテキストファイルの内容をPostscriptプリンタで印刷するには,ASCII文字や漢字をPostscriptに変換してプリンタに送り込む必要がある. テキストファイルとは,エディタで編集可能な`文字'からなるファイルでcatmorelessでその内容が表示できるファイルである.

テキストファイルをPostscriptに変換するためのプログラムはいくつか知られている. 本学で使えるコマンドk2psはその一つである. ただし、漢字ファイルはJISコードに変換されていることが前提である(以下の例は、既にJISコードになってファイルを想定している)。

たとえばテキストファイルreport.texをPostscriptプリンタで印刷するには次のようにする.

% k2ps report.tex | lpr
プログラムの解説によく見られるように,行番号を付けて印刷するには
% k2ps -n report.tex | lpr
-nのオプションを付ければよい. 知っていると便利なオプションを,表に示した.

テキストファイルをPostscriptに変換するフィルタk2psのオプション
オプション 意味
-n 行番号を付ける
-dx xとしてdまたは2を指定すると2段組で印刷する.
-kfont 漢字フォントを指定する. fontとしてgを指定するとゴシック体,jならJISフォントになる.mはデフォルトで明朝体.
-npg ページ枠を印刷しない.
-nph ヘッダを印刷しない.
-npn ページ番号を印刷しない
-tname 印刷されるタイトルをnameにする. デフォルトはファイル名.
-Tn タブの文字数をn文字にする.デフォルトは8文字.

演習3:テキストファイルindex.htmlをPostscriptプリンタで印刷するにはどうするか.

sort
入力行を並べ替える. 並べ替えの条件オプションは次の通り.

ソートsortのオプション
オプション 意味
-n 数値として比較
-r 逆順にソート
-f 大文字と小文字を区別しない
+i i番目のフィールド以降を比較(最初のフィールドは0番目).

フィールドとは"単一の空白文字(空白またはタブ)で区切られた領域"である. 空白が2つ以上続いた場合,先頭の空白が区切り文字として扱われ,2番目以降は次のフィールドに含まれる.

演習4:オプション-lのついたコマンドls -lが表示する行の各フィールドの意味を調べて述べよ.

演習5:指定したディレクトリにあるファイルを,ファイルサイズの`大きい順'にならべよ.

fold
一行を指定した文字列数で折り返す. デフォルトは半角で80文字(全角で40文字). ファイルfileを50文字で折り返して表示するには,次のようにする.
% fold -w50 file
   または
% cat file | fold -w50

演習:いろいろなファイルでこれを確かめよ.

head
ファイルの先頭行(デフォルトで10行)を表示する. ファイルfileの先頭20行を表示するには
% head -20 file

tail
ファイルの末尾行(デフォルトで末尾10行)を表示する. ファイルfileの末尾20行を表示するには
% tail -20 file

演習6:次のコマンドの意味は何か.

% cat file | head -50 | tail -10

wc
ファイルの行数,単語数や文字数を表示する(漢字の場合には正しく表示されないことがある).
% wc file
     100     340    1234 number
は,左からファイルfileの行数,単語数,文字数(コントロール文字を含む)である. 個々の情報だけを表示するには,次のオプションを使う.

オプション 意味
-l 行(Line)数の表示
-w 単語(Word)数の表示
-c 文字(Character)数の表示

オプションを複数指定すれば,指定した順番に表示させることができる.

% wc -l *.tex
は,拡張子.texの付くファイルの行数を表示する.

演習7public_html直下にあるHTML文書ファイルをその行数の少ない順に表示せよ.

提出課題

以上の演習1〜7までを答えてLaTeX文書にまとめて提出せよ. 説明を要する場合には文書で明解に説明する. それ以外では,要求された課題を実現するための(パイプやリダイレクションを組み合わせた)コマンドを書け. ただし,列挙箇条書enumerate環境を使って演習問題の順に答えよ.
\begin{enumerate}
\item 1番目の回答
....
\item 7番目の回答
\end{enumerate}
のように書け. さらに,
% ls -l > list
のようにコマンドラインに入力する様子を書くには,次のようにverbatim環境を使え.
\begin{verbatim}
% ls -l > list
\end{verbatim}
また,「コマンドlsを使って」というようにコマンドを文中に書くときには
コマンド{\tt ls}を使って
のように{\tt ....}を使って,コマンドをタイプライタ体のフォントで表せ(verbatim環境も英数字はタイプライタ体となる).

注意: 7題すべてに答えていること,およびLaTeX文書として『美しく』書かれていることが絶対条件.


情報処理概論目次