Jump to content 日本-日本語

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

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

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

HP-UX/Integrityサーバー お問い合せ
コンテンツに進む
6日目:リダイレクションとパイプを活用する
6回に渡って連載してきたLinuxの教科書も、今回で基礎編のひと区切りとし、次回からは新たに応用編が始まります。基礎編最終回となる今回は、UNIXのシェルを特徴づけている、リダイレクションとパイプという2つの基本機能を中心に解説しましょう。どちらも、シェルにおける柔軟なテキスト処理には欠かすことのできない機能です。
UNIXの教科書〜はじめよう! WindowsとLinuxからのステップアップ〜 6日目
標準入出力とリダイレクション
コマンドを接続するパイプ
2008年4月
大津 真

UNIXの教科書:登場人物紹介 このリンクをクリックすると、新しいウィンドウが開きます

マリー先生
マリー先生:
今回は、コマンドラインを活用する上での必須の機能である「リダイレクション」と「パイプ」について説明しましょう。これらはちょっと高度な機能なのだけれど、うまく使うとコマンドラインが格段に便利になるのでがんばって理解してね。
その前に、前回のviエディタの説明に関してなにか質問ありますか?
四色君:
viエディタでテキストファイルを開いたときに、各行に行番号を表示することはできますか?
四色君
マリー先生
マリー先生:
できるわよ。exモードのコマンドである「:set number」(または、「:set nu」でも可)を実行すれば、各行の左側に行番号が表示されるの。
viエディタで行番号を表示する
図1:viエディタで行番号を表示する
タックス君:
もとの状態に戻すには?
タックス君
マリー先生
マリー先生:
行番号を消すには「:set nonumber」(または、「:set nonu」でも可)を実行してね。

今日の時間割 標準入出力とリダイレクション コマンドを接続するパイプ 練習問題

1時間目:標準入出力とリダイレクション

この時間では、まずシステムに用意されているコマンドのデフォルトの入出力先である標準出力と標準入力について説明します。その後で、標準入出力をファイルに割り当てるリダイレクションの使い方を紹介しましょう。

標準出力とは

シェル上で実行されるコマンドには、結果をターミナルの画面に表示するものが少なくありません。たとえば、dateコマンドは現在の日付時刻を画面に表示します。

$ date
Wed Mar 26 21:53:09 JST 2008

このとき、dateコマンドの内部では、画面という物理的なデバイスではなく、「標準出力」と呼ばれるUNIXシステムにあらかじめ用意されている仮想的な出力デバイスに日付時刻を出力しています。初期状態では「標準出力」は画面に割り当てられているため、結果が画面に表示されるわけです。
dateコマンドの結果は標準出力に出力されている
図2:dateコマンドの結果は標準出力に出力されている

タックス君:
「標準出力」の「標準」とは? 意味がよくわからないのですが…。
タックス君
マリー先生
マリー先生:
そうね。これは英語の「standard output」を直訳したものなの。デフォルトの出力先のようなイメージでとらえてね。参考までにちょっと詳しく説明しましょう。
UNIXのコマンドの多くはC言語というプログラミング言語で作られているの。C言語では結果を表示するのにprintf()という命令(関数)を使うのだけど、このprintf()というのは標準出力に文字列を表示する命令なの。言い換えると、プログラムの中でprintf()を使って出力された文字列は標準出力に送られるのね。標準出力は初期状態で画面に設定されているため、結果として画面に実行結果が表示されるというわけ。

標準入力とは

デフォルトの出力先である標準出力と同じように、UNIXにはデフォルトの入力先として「標準入力」が用意されています。想像がつくと思いますが、標準入力は初期状態でキーボードに割り当てられています。
コマンドによっては、なんらかの入力を標準入力から受け取るものがあります。たとえばcatは、引数で指定したファイルの内容をそのまま表示するコマンドです。ただし、引数にファイルのパスを指定しない場合には、標準入力、つまりキーボードから入力を受け取りとるようになります。
実際に試してみましょう。キーボードから文字列をタイプすると、Enterキーを押すごとにそれをそのまま標準出力、つまり画面に表示します。終了するには「Ctrl + D」キーを押します。

$ cat 
Hello【Enter】 ←文字列をタイプしてEnterキーを押す
Hello      ←入力した文字列がそのまま表示される
HP-UX【Enter】 ←文字列をタイプしてEnterキーを押す
HP-UX      ←入力した文字列がそのまま表示される
	    ←「Ctrl + D」キーを押すと終了
$

四色君:
「標準入力」は英語では「standard output」ということは、標準入力は「standard input」の略ですね。
四色君
マリー先生
マリー先生:
そうね。あと、エラーのデフォルトの出力先として「標準エラー出力(standard error)」というのも用意されているの。略して、標準出力は「stdout」、標準入力は「stdin」、標準エラー出力は「stderr」と表記されることもあるわ。
タックス君:
catコマンドを終了するのに使った「Ctrl + D」はどういう意味があるのですか?
タックス君
マリー先生
マリー先生:
標準的なターミナルの設定では「Ctrl + D」キーを押すと、ファイルの終わりを示す記号である「EOF(End Of File)」という特殊な文字コードが送られるの。ターミナルの設定内容を表示する「stty -a」コマンドを実行すると確認できるわよ。

$ stty -a
speed 9600 baud; line = 0; 
rows = 44; columns = 163
min = 4; time = 0; 
intr = ^C; quit = ^\; erase = ^H; kill = ^U
eof = ^D; eol ; eol2 ; swtch 
stop = ^S; start = ^Q; susp = ^Z; dsusp = ^Y
werase = ^W; lnext = ^V
〜以下略

実行結果の「eof = ^D」という部分が、EOFが「Ctrl + D」キーにアサインされていることを示しているの。

標準出力のリダイレクション

標準入出力の概要が理解できたところで、リダイレクションの説明に移りましょう。その名前から想像がつくかもしれませんが、リダイレクションとは標準入力もしくは標準出力を指定したファイルにリダイレクト、つまり切り替える機能です。
まずは、イメージしやすい標準出力のリダイレクションから説明しましょう。次に書式を示します。

コマンド > ファイルのパス

記号には「>」を使用する点に注目してください。出力のリダイレクションを使うことにより、コマンドの実行結果を格納するファイルを作成できます。たとえば、dateコマンドの出力をカレントディレクトリの下にファイル「date.txt」を作成して書き込むには、次のようにします。

$ date > date.txt
$ cat date.txt	←catコマンドで確認
Wed Mar 26 22:18:34 JST 2008

イメージとしては図3のようになります。

dateコマンドの標準出力を画面からファイルに切り替える
図3:dateコマンドの標準出力を画面からファイルに切り替える

別の例を示しましょう。catコマンドの出力をファイルにリダイレクトすることによって、キーボードから入力した文字をファイルに書き込めます。短いテキストファイルを簡単に作成できるので、覚えておくと便利です。

$ cat > test.txt
Hello【Enter】 ←文字列を入力
HP-UX【Enter】 ←文字列を入力
        ←「Ctrl + D」キーを押すと終了
$ cat test.txt ←catコマンドで確認
Hello
HP-UX

タックス君:
出力のリダイレクションを行うときに、リダイレクト先のファイルが存在していた場合はどうなりますか?
タックス君
マリー先生
マリー先生:
その場合、何の警告もなく上書きされてしまうので注意してね。

追加のリダイレクション

前述のように出力リダイレクションの記号として「>」使用すると、ファイルが存在していた場合にはファイルが上書きされてしまいます。それに対して「>>」を使うと、ファイルの最後に追加されます。

コマンド >> ファイルのパス

たとえば、前項で作成した「date.txt」に今月のカレンダーを追加するには、calコマンドの出力をリダイレクトして次のようにします。

$ cal >> date.txt
$ cat date.txt	←catコマンドで確認
Wed Mar 26 22:18:34 JST 2008
   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

四色君:
「>>」を使用する場合に、リダイレクト先のファイルがない場合にはどうなりますか?
四色君
マリー先生
マリー先生:
その場合は「>」と同じ動作になるの。つまり、ファイルが作成されてそこに書き込まれていくわけ。

標準入力のリダイレクション

標準出力と同じく、標準入力をファイルにリダイレクトすることができます。この場合、データは指定したファイルから読み込まれることになります。

コマンド < ファイルのパス

たとえば、次のようにすることで、ファイル「date.txt」の内容を行番号付きで画面に表示できます(「-n」は行番号を表示するオプション)。

$ cat -n < date.txt
     1  Wed Mar 26 22:18:34 JST 2008
     2     March 2008
     3   S  M Tu  W Th  F  S
     4                     1
     5   2  3  4  5  6  7  8
     6   9 10 11 12 13 14 15
     7  16 17 18 19 20 21 22
     8  23 24 25 26 27 28 29
     9  30 31

標準入力と標準出力のリダイレクションを組み合わせて使用することもできます。たとえば、次のようにすることで「date.txt」を「newfile.txt」にコピーすることができます。

$ cat < date.txt > newfile.txt

四色君:
catコマンドは表示するファイルを引数に取るので、標準入力をリダイレクトしなくても同じことができますよね。
四色君
マリー先生
マリー先生:
そうね、 「cat -n < date.txt」は「cat -n date.txt」、また、「cat < date.txt > newfile.txt」は「cat date.txt > newfile.txt」としても同じね。つまり、実際にはcatコマンドの場合、標準入力のリダイレクションは使わなくてもいいわけ。
それと、標準出力と標準入力を同じファイルにリダイレクトしないように注意してね。
タックス君:
そうすると結果はどうなるのですか?
タックス君
マリー先生
マリー先生:
たとえば「cat < date.txt > date.txt」のようにすると、最初にファイルの内容がクリアされて、「date.txt」が空になってしまうの。

文字を置換するtrコマンド

catコマンドなどテキスト処理に関するコマンドの多くは引数にファイルのパスを指定できるため、標準入力をリダイレクトしなければならないケースはそれほど多くありません。ただし、コマンドによっては入力を標準入力からしか受け取らないものがあります。たとえば、文字を置換するtrコマンドがそのひとつです。

tr 置換前の文字 置換後の文字

このtrコマンドは、標準入力からデータを受け取り、結果を標準出力に送ります。処理したいファイルのパスを引数に取ることはできません。したがって、テキストファイル内の文字を置換するには標準入力をリダイレクトするか、あるいは後述するパイプを使う必要があります。
たとえば、ファイル「sample.txt」の中の「:」を「,」に置換して、画面に表示するには次のようにします。

$ cat name.txt		←元のファイルを表示
makoto otsu:41
taro yamada:50
tomiko nekota:30
$ tr ":" "," < name.txt	←「:」を「,」に置換
makoto otsu,41
taro yamada,50
tomiko nekota,30

休み時間:改行コードのOSによる相違

テキストファイルの各行には、最後に1行の終わりを示す「改行コード」が埋め込まれています。この改行コードはOSによって標準で使用されるコードが異なります。

OS 改行コード
Windows CRLF(キャリッジリターン+ラインフィード)
Mac OS9以前 CR(キャリッジリターン)
UNIX/Mac OSX以降 LF(ラインフィード)
表1:各OSで標準とされる改行コード

CR(キャリッジリターン)とLF(ラインフィード)は、どちらも英文タイプライターに用意されているキーに由来します。CRでヘッドが初期位置に戻り、LFは1行分だけ用紙が送られます。
WindowsやMac OSの改行コードをUNIX標準のLFに変換するには、trコマンドが使用できます。たとえば、Windowsの「CRLF」からUNIXの「LF」に変換するには、CRを削除します。
文字の削除は、次の書式でtrコマンドを実行します。

tr -d "文字"

また、CRは「\r」、LFは「\n」で表記できます。したがって、改行コードがCRLFの「win.txt」の、改行コード「CR」を削除し、「unix1.txt」に保存するには次のようにします。

$ tr -d "\r" < win.txt > unix1.txt

また、改行コードが「CR」の「mac.txt」の、改行コードを「LF」に置換し、「unix2.txt」に保存するには次のようにします。

$ tr "\r" "\n" < mac.txt > unix2.txt

連載記事一覧 1  |  2 次のページへ

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

お問い合わせ

ご購入前のお問い合わせ


ご購入後のお問い合わせ

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

ショールーム

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