ディレクトリ /etc に存在する全ファイルの詳細情報を調べましょう。
ls -la /etc/etc にはファイルがたくさんあるので,画面にすべてを表示しきれませんね。 どうしたらいいでしょう。
一つの解決策として,
>
) を使って
ls -la /etc > etcfilesを実行します。シェルの入力支援機能を積極的に利用して,タイプの手 間をできるだけ省いてください15。
more etcfilesを実行してみてください。more の操作方法は,man コマンドに よるマニュアルページの閲覧方法と同じです。man は内部的に more を呼び出して,マニュアルを表示しているのですから。
more < etcfilesを実行してください。
<
の有無に拘らず実行結果は同じ
ですが,more の内部的な動作は異なります。more は引数にファ
イル名が与えられれば,そのファイルを直接読み込みます。一方,
引数の代わりに <
に続いてファイル名を指定すると,標
準入力からファイルを読み込みます(標準入力のリダイレクト)。
なお,more は処理結果を標準出力に出力しますが,その先につ ながっているのは,これまでと同様に通常は画面です。
rm etcfiles
ls の出力を見たいだけなのに,それを一時的にファイルに保存してから more で見て,見終わったら rm で削除するというのでは,あまりに不便ですね。パイ プを使うと,ファイルを介さずに,前節と同様のことを一度の操作で行うことが できます。
あるコマンドの標準出力を,ファイルではなく,別のコマンドの標
準入力に直接接続することが可能です。その操作をパイプと呼びます。
パイプは,コマンド行において,一連のコマンドを「縦棒 (|
)」で区切っ
て記述することによって行います。パイプによって連結された一連のコマンドを
パイプライン (pipeline) と言います。
なお,コマンドの標準出力と標準エラー出力の両方を次のコマンドの標準入力に
接続するには,使っているシェルが csh や tcsh の場合,|
の代わりに
|&
とします。
では,/etc に存在する全ファイルの詳細情報を,パイプを使って一度に表示し
て閲覧してみましょう。
ls -la /etc | more
この状況を示したものが次の図です。図では ls の引数 (-la /etc) の記述は
省略しています。
動作の概要は以下のとおりです。
ls の標準出力をパイプによって more の標準入力に接続しているので, ls の実行結果は画面には出力されません。
次の例は,ls の出力を辞書順の逆順に並べ替えて表示します18。
ls | sort -r
結果を画面ではなく,ファイル rlist に入れたければ
ls | sort -r > rlist
を実行します。このようにパイプと標準入出力のリダイレクトを同時に利用する
ことが可能です。
command1 が標準出力 (stdout) に結果を出力するコマンドであり,command2 と command3 が標準入力 (stdin) から入力を読み取っ て結果を標準出力 (stdout) に出力するコマンドならば,
command1により,次の図に示す多段のパイプが可能です。 これにより,command1 の出力が command2 で処理され,さらに command3 で処理されます。|
command2|
command3
なお,これまでと同様に,パイプラインの中の各コマンドには引数を与えること もできます。また,4つ以上のコマンドをパイプすることもできますし,その出 力をリダイレクトすることも可能です。
先の command2 や command3 のように,標準入力と標準出力を使っ た入出力が可能なコマンドをフィルタ (filter) といいます。フィルタは パイプラインの中で利用できるコマンドです。
これまでに紹介したコマンドでは
cat, grep, head, sort, tail, tr, uniq, wcはフィルタです。各コマンドの動作を忘れていたら,man コマンド等で 確認しましょう。
カレントディレクトリを,第 4.4 節の問題で作成したディレ クトリ (~/unix/part4) に変更してから以下の問題を解いてください。
うまくいったら,ここで作成したファイルは削除しましょう。
grep は,引数で与えた文字列パターンを含む行のみを抽出して,標準出 力に出力するコマンドです。
grep pattern file...の書式で実行すると,grep はfile... から patten を含む 行のみを抽出しますが,file... を省略すると,標準入力から入 力を読み込みますので,フィルタとして利用できます。
さて,この問題をリダイレクトを使って解くには,例えば
を実行します。 パイプを使ってこれに相当する操作を行ってください。ls -l > temp
grep Dec temp
またはgrep Dec < temp
rm temp
同じ計算機を使っているユーザーを,辞書順に並べて表示しましょう。
さらに,その結果に行番号を付けて出力しましょう。引数にファイル名 を指定せずに cat コマンドを使うと,cat は標準入力から入力を読み込 みます。
利用者が自分一人のときだけ上手くやり方ではだめですよ。
who am i
もなしです。