Jump to content 日本-日本語

製品  >  ソフトウェア  >  HP-UX   >  Knowledge-on-Demand  >  UNIXの教科書 基礎編

UNIXの教科書
〜はじめよう! WindowsとLinuxからのステップアップ〜

6日目:リダイレクションとパイプを活用する

HP-UX/Integrityサーバー お問い合せ
コンテンツに進む
6日目:リダイレクションとパイプを活用する
UNIXの教科書〜はじめよう! WindowsとLinuxからのステップアップ〜 6日目
標準入出力とリダイレクション
コマンドを接続するパイプ

2時間目:コマンドを接続するパイプ

ここまでの説明で、標準入力と標準出力、およびそれらをファイルに切り替えるリダイレクションの概要がつかめたと思います。続いて、標準入出力を組み合わせてコマンドを接続する「パイプ」について説明しましょう。この連載を読み進めてきたみなさんは、UNIXのコマンドは、比較的シンプルな機能のものが多いということに気がついたことでしょう。それらのコマンドをパイプで組み合わせて使うことによって柔軟な処理が可能になります。

パイプの概要

「パイプ」とは、文字通り土管のようなイメージで、あるコマンドの標準出力と別のコマンドの標準入力に接続する機能です。
パイプはあるコマンドの標準出力を別のコマンドの標準入力に接続する
図4:パイプはあるコマンドの標準出力を別のコマンドの標準入力に接続する

つまりパイプを使うと、あるコマンドの実行結果を別のコマンドで処理できるわけです。たとえば、「/etc/services」の先頭の5行を行番号付きで表示したいとしましょう。ここで、テキストファイルの先頭部分(デフォルトで10行)を表示するコマンドにheadがあります。

head -n 行数 ファイルのパス

ただし、headだけでは行番号を表示できません。そこで、行番号付きでファイルの内容を表示する「cat -n」コマンドから結果を受け取り、パイプを使用して「head -n 5」で先頭の5行を表示すればよいわけです。

$ cat -n /etc/services | head -n 5
  1  # @(#)B.11.31_LRservices $Revision: 1.32.214.7 $ $Date: 97/09/10 14:50:42 $
  2  #
  3  # This file associates official service names and aliases with
  4  # the port number and protocol the services use.  
  5  #

四色君:
1時間目に習った出力のリダイレクションを使えば、結果をファイルに書き出せることがわかりました。それでは、結果をファイルに書き出しつつ、画面に表示することはできないのですか?
四色君
マリー先生
マリー先生:
標準入力から受け取ったデータを、標準出力と引数で指定したファイルの両方に出力するteeというコマンドがあるの。したがって、コマンドの出力をパイプでteeコマンドに渡せば、ファイルと画面の両方に出力できるわ。たとえば、calコマンド出力を、ファイル「cal.txt」に書き出しつつ、標準出力にも表示するには次のようにすればいいわけ。

$ cal | tee cal.txt
   March 2008
 S  M Tu  W Th  F  S
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

3つ以上のコマンドをパイプで接続する

パイプで接続できるコマンドは2つだけではありません。3つ以上のコマンドを組み合わせたより高度な処理も可能です。たとえば、「/etc/services」というファイルのの96行目から100行目までを行番号付きで表示したいとしましょう。まず、行番号を表示するのは「cat -n」で可能です。それでは、96行目から100行目を表示するには、どうすればよいでしょう?それは、前述のheadコマンドと、ファイルの最後の部分を表示するtailコマンドを組み合わせることによって実現できます。
次に示すように、tailコマンドの書式はheadコマンドと同じです。

tail -n 行数 ファイルのパス

つまり、「head -n 100」で最初の100行を取り出し、パイプで「tail -n 5」に渡して最後の5行を表示します。全体としては、次のように実行します。

$ cat -n /etc/services | head -n 100 | tail -n 5
    96  uucp         540/tcp  uucpd          # uucp daemon
    97  dhcpv6-client   546/tcp              # DHCPv6 Client
    98  dhcpv6-client   546/udp              # DHCPv6 Client
    99  dhcpv6-server   547/tcp              # DHCPv6 Server
   100  dhcpv6-server   547/udp              # DHCPv6 Server

タックス君:
リダイレクションとパイプをいっしょに使うことはできるのですか?
タックス君
マリー先生
マリー先生:
もちろん。たとえば、前の例の実行結果を「out.txt」に書き出すには次のようにすればいいわ。

$ cat -n /etc/services | head -n 100 | tail -n 5 > out.txt

フィルタコマンド

標準入力からデータを受け取り、その結果を標準出力に出力するコマンドのことを「フィルタコマンド」などと呼びます。つまり、フィルタコマンドは、パイプやリダイレクションでの使用を前提にしたコマンド群であるわけです。表2に基本的なフィルタコマンドの例を示します。

コマンド 説明
tr 文字を置換する
uniq 隣接する重複行を取り除く
wc 文字数や行数を数える
head ファイルの先頭部分を表示する
tail ファイルの最後の部分を表示する
cut 各行のフィールドを抜き出して表示する
sort ファイルの各行をソートする
表2:フィルタコマンドの例

フィルタコマンドをうまく活用すること、柔軟な処理が可能になります。いくつか例を示しましょう。
たとえばwcは、テキストファイルの行数、単語数、文字数などをカウントするコマンドです。「-w」オプションを指定すると単語数を表示します。おなじみのlsコマンドの出力をパイプ「|」を介して「wc -w」コマンドに渡すことによって、指定したディレクトリ以下のファイル数(ディレクトリを含む)をカウントできます。たとえばルート「/」ディレクトリ以下のファイル数をカウントするには次のようにします。

$ ls / | wc -w
16

また、カレントディレクトリの下にある、拡張子が「.txt」のファイルの数を表示するには、ワイルドカード「*」を使用して次のようにします。

$ ls *.txt | wc -w
11

マリー先生
マリー先生:
「wc -w」は単語数だけど、「wc -l」は行数をカウントするの。前の例の「ls *.txt | wc -w」は「ls *.txt | wc -l」としても同じよ。

$ ls *.txt | wc -l
11
タックス君:
あれ、でも「ls *.txt」を実行すると結果は横に並びますよね。

$ ls *.txt
A.txt      AKK.txt    backup.txt   mac.txt    profile.txt  unix.txt
AB.txt     C01.txt    cal.txt      out.txt    sample.txt   win.txt

「wc -l」で行数をカウントすると2行になるんじゃないですか?
タックス君
マリー先生
マリー先生:
実はlsコマンドは、結果を画面に表示する場合にはわかりやすくするために横に並べて表示するのだけど、パイプで別のコマンドに渡す場合には1行にひとつずつ渡されるの。catコマンドにパイプで渡してみるとわかるわよ。

$ ls *.txt | cat
AB.txt
AKK.txt
C01.txt
backup.txt
cal.txt
mac.txt
out.txt
profile.txt
sample.txt
unix.txt
win.txt

別の例を示しましょう。ファイル内のユニークな行を見つける、つまり重複する行を取り除くコマンドにuniqがあります。uniqコマンドで重複する行を取り除くためには、それらの行が隣接している必要があります。中身が同じ行でも、離れた場所にある行は取り除けません。
たとえば、次のようなファイル「sample.txt」があるとします。

AAA
BBB
BBB
CCC
AAA
CCC

このファイルを引数に、uniqコマンドを実行すると次のような結果になります。

$ uniq sample.txt
AAA
BBB
CCC
AAA
CCC

隣接した重複行である「BBB」のみが取り除かれ、離れた位置の重複行である「AAA」と「CCC」は取り除くことはできません。この場合ファイルの行を並び替えるsortコマンドを実行し、その結果をパイプ「|」でuniqコマンドに渡すと、離れた場所にある重複行も取り除くことができます。

$ sort sample.txt | uniq
AAA
BBB
CCC

四色君:
どのくらい重複しているかを調べることはできるのですか?
四色君
マリー先生
マリー先生:
uniqコマンドを「-c」オプションを指定して実行すれば、重複回数が各行の左に表示されるわ。

$ sort sample.txt | uniq -c
   2 AAA
   2 BBB
   2 CCC

練習問題

第1問:新たにテキストファイル「hp.txt」を作成し、文字列「hp-ux」を書き込むコマンドはどれか?

a) echo "hp-ux" > hp.txt
b) echo "hp-ux"  hp.txt
c) cat "hp-ux" > hp.txt
d) echo "hp-ux" < hp.txt
正解はこちら
a) echo "hp-ux" > hp.txt
echoは引数をそのまま標準出力に出力するコマンド。標準出力のリダイレクション「>」を使用してファイルにリダイレクトすることにより、ファイルに文字列を書き込める。

第2問:カレントディレクトリの下の「orig.txt」を「new.txt」にコピーするコマンドとして正しくないのはどれか?

a) cp orig.txt new.txt
b) cat orig.txt > new.txt
c) cat < orig.txt > new.txt
d) cat < orig.txt new.txt
正解はこちら
d) cat < orig.txt new.txt
catコマンドでファイルをコピーするには、引数に入力ファイルのパスを指定し、標準出力のリダイレクション「>」を使って出力ファイルを指定する。あるいは、入力ファイルを標準入力のリダイレクション「<」を使用して指定してもよい。

第3問:Picturesディレクトリの下にある拡張子が「.png」のファイルの数を表示するコマンドはどれか?

a) ls Pictures/*.png | number
b) ls Pictures/*.png | wc -w
c) ls Pictures/*.png > wc.txt
d) ls Pictures/*.png < wc -w
正解はこちら
b) ls Pictures/*.png | wc -w
「wc -l」は単語をカウントするコマンド。したがって「ls Pictures/*.png」の出力をパイプで「wc -l」に渡せば、拡張子が「.png」のファイル数が求められる。

第4問:ファイル「sample.txt」の重複行を削除し、行番号付きで画面に表示するコマンドはどれか?

a) sort sample.txt | uniq
b) uniq | cat -n
c) sort sample.txt | cat
d) sort sample.txt | uniq | cat -n
正解はこちら
d) sort sample.txt | uniq | cat -n
uniqコマンドで重複行を削除するためには、あらかじめソートしておく必要がある。

連載記事一覧 戻る 1  |  2

教科書シリーズ 「UNIXの教科書」 「HAクラスターの教科書」 連載記事一覧

UNIXの教科書「基礎編」

第1日目:ログインしてコマンドを実行してみる
第2日目:ディレクトリやファイルを操作してみる
第3日目:シェルの基本を知る
第4日目:ファイルの基本操作
第5日目:viエディタの操作(基本編)
第6日目:リダイレクションとパイプを活用する
期末試験

UNIXの教科書「応用編」

第1日目:grepコマンドと正規表現
第2日目:ファイルの検索
第3日目:viエディタの操作(活用編)
第4日目:ファイルの圧縮とアーカイブ
第5日目:ジョブとプロセスの操作
第6日目:シェルの環境設定
第7日目:シェルスクリプトでより便利に
期末試験

UNIXの教科書「運用編」

第1日目:ユーザーの管理
第2日目:ファイルの安全管理(その1)
第3日目:ファイルの安全管理(その2)
第4日目:ネットワークの基本を理解する
第5日目:ネットワーク関連のコマンド
第6日目:システム情報の表示
期末試験 New!

HAクラスターの教科書

第1日目:ハードウェア構成を知る
第2日目:ネットワークを設定する
第3日目:共有ディスクを構成する
第4日目:HAクラスターを構成する
第5日目:パッケージを構成する
第6日目:障害テストを実施する
期末試験

 その他の連載記事


本ページの内容は執筆時の情報に基づいており、異なる場合があります。

お問い合わせ

ご購入前のお問い合わせ


ご購入後のお問い合わせ

HPEサポートセンター
製品の標準保証でご利用いただける無償のサービスです。

ショールーム

ショールーム 導入をご検討のお客様へ
業務アプリケーションの継続・標準化・開発性とシステム担当者様、システム開発者様が抱える悩み・疑問に対する解決策実体験して頂けます。
印刷用画面へ
プライバシー ご利用条件・免責事項