このセクションでは自宅サーバーとしてLinuxを扱ううえで役に立つ基本操作基礎知識テクニックについて初心者/ビギナー向けに解説します。
お便利サーバー.com+相互リンクサイト内をキーワードで検索
LinuxOSの使いこなし術

LinuxOSを使いこなす

クライアントOSとの違い

絶対パスと相対パス

"パスが通っている"とは?

"/"と"."と".."の意味

"."(ドット)ファイルについて

ワイルドカードと正規表現

コマンドの強制終了

コマンド操作の補完機能

コマンド操作の履歴機能

リダイレクトとパイプ

属性とパーミッション〜その1

属性とパーミッション〜その2

アカウント情報ファイルの操作

ランレベルについて

システムが起動しないときは

ハードディスクの増設

アプリケーションの導入法

Ubuntu 10.04 LTS デスクトップ版のススメへようこそ

リダイレクト処理とパイプ処理の意味

リダイレクト処理とは、

コマンド と、ファイルや デバイス との間を標準入出力で繋いで処理すること。」

を指します。

これだけでは何のことかわからないと思いますので、簡単な例を挙げて説明しましょう。

コマンドの多くは、実行した結果を画面に表示するのが普通です。中には ls や、 printenv のように、単純にシステムの状態を表示するだけのコマンドもたくさんあります。

このような、画面上に表示される「結果」をそのままファイルに書き込み、保存するには、次のように行います。

[tanaka@web1 ~]$ ls -lEnter  カレントディレクトリを一覧します。
合計 0
[tanaka@web1 ~]$ printenv > env_var.datEnter
[tanaka@web1 ~]$ ls -lEnter  カレントディレクトリを一覧します。
合計 4
-rw-rw-r--  1 tanaka  tanaka    998 10月 22 22:39 env_var.dat
  "env_var.dat"が作成されました↑。
[tanaka@web1 ~]$ nano env_var.datEnter


リダイレクト処理で作成したenv_var.datファイル
リダイレクト処理で作成した"env_var.dat"ファイル

このように、 標準出力 を、ファイルや デバイス (プリンタなど)に書き出したり、あるいはその逆にファイルやデバイス(キーボードなど)を出力として、コマンドなどに入力として送る作業をリダイレクト処理といいます。

一般に、「コマンド→ファイルやデバイス」を 出力のリダイレクト 、「コマンド←ファイルやデバイス」を 入力のリダイレクト と呼びます。

一方のパイプ処理は、

「コマンドの実行結果を次のコマンドに受け渡して実行させる手段。」

です。

コマンドの書式は一般的に、

コマンド [オプション] [引数] Enter

です。

これだけでは、一つのコマンドラインに対しては一つの命令しか適用することができませんが、 "|" 記号を使って複数のコマンドラインを繋ぐことで、 「左側のコマンドの処理結果を右のコマンドで再処理する」 ということが可能になる訳です。

このページの先頭へ↑

出力のリダイレクト

コマンド 操作で比較的良く用いられるのは出力のリダイレクトです。上のパートで行ったのは、代表的な出力のリダイレクトの例です。

出力のリダイレクトは、 ">" または ">>" を記号として使います。

一般的な使用方法は、

[コマンド] >または>> [ファイル名または デバイス名]

となります。

">"、と">>"の違いは、">"が「出力先の元の内容を破棄して新しい出力に置き換える」のに対し、">>"は「出力先の元の内容に新しい出力を追記する」というところにあります。

例えば、現在の日付を画面出力する date コマンドと、 df コマンドを利用して、

[tanaka@web1 ~]$ date > home_df.logEnter
[tanaka@web1 ~]$ df /home >> home_df.logEnter

と実行すれば、"home_df.log"は次のように作成されます。

作成したhome_df.logの内容

しかし、もう一度

[tanaka@web1 ~]$ date > home_df.logEnter
[tanaka@web1 ~]$ df /home >> home_df.logEnter

を実行してしまうと、"date > home_df.log"という「出力先の元の内容を破棄して新しい出力に置き換えるリダイレクト処理」によって、前回の出力結果は消去されてしまいます。

そこで二度目からは次のように、すべて">>"で「追記のリダイレクト処理」を行うように命令を変更します。

[tanaka@web1 ~]$ echo >> home_df.logEnter  空白行を追記します。 出力のリダイレクトで追記する
[tanaka@web1 ~]$ date >> home_df.logEnter
[tanaka@web1 ~]$ df /home >> home_df.logEnter

すると以下のように、"home_df.log"には過去のデータがずっと残るようになります。

追記されたhome_df.log

出力のリダイレクトは cat コマンドと組み合わせるととても便利です。

例えば、 Postfix の設定がおかしくなって、設定ファイルである "/etc/postfix/main.cf" を完全にデフォルト状態に戻したい場合、当たり前に考えると、

1."/etc/postfix/main.cf"の パーミッション を確認する。

2."/etc/postfix/main.cf"を削除する。

3.予めとっておいたバックアップファイルである "/etc/postfix/main.cf.org" /etc/postfix/main.cfの編集 を、 cp -p コマンドを使って"/etc/postfix/main.cf"という名前でコピーする。

という手順をとってしまいがちですが、出力のリダイレクトとcatコマンドを使うと同様の操作が、

[root@web1 ~]# cd /etc/postfix/Enter cdコマンドについて
[root@web1 ~]# cat main.cf.org > main.cfEnter

と、たったこれだけで行うことができます。

NEC「得選街」
このページの先頭へ↑

入力のリダイレクト

入力のリダイレクトは、 "<" または "<<" を記号として使います。

一般的な使用方法は

[コマンド] <または<< [ファイル名または デバイス名]

となります。

処理の方向としては出力のリダイレクトと逆ですから、

「[ファイル名またはデバイス名]の内容を[コマンド]で処理する。」

という意味になります。

例えば、 WBEL CentOS の起動時に ハードウェア の動作チェックを行った結果を記録した、 "/var/log/dmesg/" というテキストファイルがあります。

/var/log/dmesg/の例
"/var/log/dmesg/"の例

システムによっては数百行にも及ぶこのファイルから、目的の行を探し出すのは大変な作業ですが、ここで grep コマンド と「入力のリダイレクト」を組み合わせて、目的の行だけを簡単に抽出することができます。

[tanaka@web1 ~]$ grep CPU < /var/log/dmesgEnter
Initializing CPU#0
CPU:  After generic, caps: 0780a17b 00000000 00000000 00000000
CPU:      Common  caps: 0780a17b 00000000 00000000 00000000
CPU: Intel(R) Celeron(R) M processor    1.30GHz stepping 08
  "/var/log/dmesg"から"CPU"を含む行だけ表示されました。↑
[tanaka@web1 ~]$

更に、これに「出力のリダイレクト」を組み合わせれば、処理の結果をファイルに書き出すことができます。

[tanaka@web1 ~]$ grep CPU < /var/log/dmesg > dmesg_cpu.txtEnter
 "/var/log/dmesg"から"CPU"を含む行だけを"dmesg_cpu.txt"に書き出します。↑
[tanaka@web1 ~]$ nano dmesg_cpu.txtEnter


dmesg_cpu.txtの内容

この「入力のリダイレクト」という処理は、実はコマンド入力操作では「出力のリダイレクト」のような有用性はあまりありません。

実際のところ、入力元のデータが テキスト ファイルである場合には、以下のパートで示す パイプ処理 で代用できるケースが多く、そのほうが「入力のリダイレクト」よりも直感的に解りやすいと思います。

ただし、例えば対話型のコマンドに対して連続的に引数を渡したりする場合などは必須ですから、「そういう使い方がある」程度に覚えておけばよいと思います。

NEC「得選街」
このページの先頭へ↑

パイプ処理

本来 「一行に1コマンド」 である コマンド シェル の命令を、実行結果を次に渡しながら連続して実行する手段が パイプ処理 です。書式は、

コマンド1 | コマンド2 | コマンド3 .... Enter

となります。もちろん、それぞれのコマンドにはそれぞれのオプションと引数を用いることができます。

つまり、コマンド1の実行結果をそのままコマンド2に渡して実行し、更にコマンド3に渡して...、という処理を行うことになります。

例えば、上の「入力のリダイレクト」で例として示した、

[tanaka@web1 ~]$ grep CPU < /var/log/dmesg > dmesg_cpu.txtEnter

は、パイプ処理を用いると、 cat コマンドを使って全く同じことを次のようにして実行できます。

[tanaka@web1 ~]$ cat /var/log/dmesg | grep CPU > dmesg_cpu.txtEnter

このコマンドラインの意味は、

「catコマンドで表示する"/var/log/dmesg"の内容を、 grepコマンドに送って"CPU"を含む行だけ抽出し、"dmesg_cpu.txt"に書き出す。」

となります。

「入力のリダイレクト」は、入力元としてファイルやデバイスしか扱うことができませんから、処理対象は例えば"/var/log/dmesg"のようにファイルになっていなければなりません。しかも、それに対して実行可能なコマンドは一つだけ(この例ではgrep)です。

しかし、パイプ処理は複数のコマンドを連続して繋ぐことができますから、コマンドの実行結果をいちいちファイルに書き出す必要はありません。

例えば、 df grep sort mail の四つのコマンドをパイプで繋げば、以下のコマンドライン一つで

ハードディスク の使用状態を デバイス 名順に並べた一覧ファイルをメールで"tanaka"に送る。」

という処理を行うことができます。

[tanaka@web1 ~]$ df | grep dev | sort | mail -s df tanakaEnter
[tanaka@web1 ~]$ nano /var/mail/tanakaEnter


tanaka宛てに送られたメールの内容
"tanaka"宛てに送られたメールの内容

もしパイプ処理を使わずに、リダイレクト処理だけで同じことをしようとすると、次のようになります。

[tanaka@web1 ~]$ df > temp1Enter
 "df"の実行結果をファイル"temp1"で保存します。
[tanaka@web1 ~]$ grep dev < temp1 > temp2Enter
 "temp1"の内容から"dev"を含む行を抽出して"temp2"で保存します。
[tanaka@web1 ~]$ sort < temp2 > temp3Enter
 "temp2"の内容をアルファベット順で並べ替えて"temp3"で保存します。
[tanaka@web1 ~]$ mail -s df tanaka < temp3Enter
 "temp3"の内容をタイトル名"df"で"tanaka"宛てにメールします。
[tanaka@web1 ~]$ rm temp1 temp2 temp3Enter
 一時的に作成した"temp1"、"temp2"、"temp3"を削除します。

パイプ処理はこのように、複雑な処理を一気に行うにはとても有用な手段です。

特に、膨大な容量になる サーバー アプリケーション のログファイルの解析などには威力を発揮しますので、活用することをお勧めします。

NEC「得選街」
このサイトに対するご意見、ご要望、苦情、泣き言、献上品、資金援助などがございましたら こちら からお寄せください(お返事できなかったらごめんなさい)。もちろん リンクフリー です。趣味や勉強のためでしたら、引用、転用、コピー、朗読、その他OKです。このサイトへのリンクについては こちら をご覧ください。また、本サイトの更新情報をメールで知らせてほしい方は ここ からご登録ください。
Powered by Apache
”Linux”は、Linus Torvalds 氏の各国における登録商標です。”Red Hat”及びRed Hatのロゴおよび Red Hat をベースとしたすべての商標とロゴは、各国におけるRed Hat, Inc. 社の商標または登録商標です。その他のプログラム名、システム名、製品名などは各メーカー、ベンダの各国における登録商標又は商標です。
www.centos.org - The Community ENTerprise Operating System