写真1
写真1
[画像のクリックで拡大表示]
写真2
写真2
[画像のクリックで拡大表示]

 あるコマンドの実行結果を別のコマンドに受け渡す機能を「パイプ」といいます。一般に,個々のLinuxのコマンドはシンプルな機能しか備えていませんが,パイプ機能で複数のコマンドをつなぐことで,複雑な処理を1行で処理できます。

 コマンドとコマンドをつなぐには,パイプ記号「|」を使います。

$ コマンド1 | コマンド2

 例えば,「/etc/services」ファイルに行番号を付け,最下部の15行を表示したいとしましょう(/etc/servicesファイルは,ネットワーク・サービスとポート番号の対応が記述された約1万行のシステム・ファイルです)。

 まず,「cat」コマンドと「tail」コマンドを説明します。catコマンドに「-n」オプションを指定すると,ファイルの各行に行番号を付与します。/etc/servicesファイルに行番号を付けるには以下のコマンドを実行します。

$ cat -n /etc/services 

 コマンドの実行結果が写真1です。/etc/servicesファイルが1万399行であることが分かります。

 最下部の任意の行を表示するには「tail」コマンドを使います。表示する行数は「-n」オプションの後に数字で指定します。/etc/servicesファイルの最下部の15行を表示するには,以下のコマンドを実行します。

$ tail -n 15 /etc/services 

 catコマンドとtailコマンドをパイプ機能で接続すれば,目的の処理を1行のコマンドで実行できます。

$ cat -n /etc/services | tail -n 15 

 コマンドの実行結果が写真2です。/etc/servicesファイルに行番号を付与して,最下部の15行を表示することができました。

 何段ものパイプをつなぐことも可能です。例えば,Webサーバー「Apache HTTP Server」のアクセス・ログからアクセス元のIPアドレスを抽出して一覧するには,次のようにします。

$ cat access_log|cut -d" " -f 1|sort|uniq

 「cut -d " "-f 1」は各行のデータをスペースで区切って1番目のフィールドを抜き出すコマンドです。sortでそれをソートし,uniqで重複がないようにします。