catによるファイルの表示、リダイレクト、追加

Red Hat Linuxには、一覧を短くしておいたり、それらをまとめたり、しかもそれと同時に、システムに潜むパワーを少しばかり示したりすることができるユーティリティがあります。

そのユーティリティとはcatで、ファイルを連結するという意味の「concatenate」の略です。

catコマンドを使用して、あるファイル全体の内容を画面に表示することもできます(たとえば、cat filename.txtと入力)。ファイルが小さい場合には、catを使用すると便利です。しかし、ファイルが大きくなると、画面上の表示がたちまちのうちにスクロールされて見えなくなってしまいます。これは、catがファイル全体を一気に表示するためです。

しかし、catは、標準入力と標準出力という2つの重要な用語を学ぶのにも役に立ちます。

標準入力と標準出力では、ユーザーとの間で入出力(I/Oとも呼ばれます)情報をやりとりします。プログラムが標準入力から情報を読み込む場合、デフォルトでは、それはつまりユーザーがキーボードから入力するということです。プログラムが標準出力へ情報を書き込む場合、デフォルトでは、それはつまり画面に情報が表示されるということです。

catを起動して、この意味を確認しましょう。シェルプロンプトから、次のように入力してください。

cat

カーソルが空白行に移動します。ここで、その空白行に、以下のように入力します。

咳をしても一人

そして、Enterキーを押します。画面は、次のようになります。

[newuser@localhost newuser]$cat
咳をしても一人
咳をしても一人

図 10-8. 入力したものと同じ内容が画面に表示されました。

catへの標準入力からの入力を終了するためには、Enterキーを押してカーソルを空白行に移動します。そして、Ctrl-D(多くのコマンドラインアプリケーションで入力終了を示すキー)を押します。

このcatコマンドの例から、標準入力と標準出力の定義がわかります。ユーザーがキーボード入力を行い(標準入力)、それが画面に表示されたわけです(標準出力)。

リダイレクト

リダイレクトとは、シェルが標準入力とみなすものや標準出力の出力先を、デフォルトのキーボードやターミナル以外のものに変更させることを意味します。

先ほど、標準入力と標準出力の意味を説明するのにcatコマンドを使用しましたが、ここでも、標準出力をリダイレクトする方法をcatを使用して説明します。

標準出力をリダイレクトするには、「>」記号を使用します。catコマンドの後ろ「>」を付けると(標準出力へ書き出すその他のユーティリティやアプリケーションでも後ろに付けます)、catからの出力は「>」の後ろに指定したファイル名に送られます。

実際に試してみましょう。シェルプロンプトで、次のように入力してください。

[newuser@localhost newuser]$cat > haiku.txt
やせ蛙
負けるな、一茶
ここにあり

図 10-9. 出力をファイルにリダイレクト

ここで、Enterキーを押して空白行に移動し、Ctrl-Dキーを押してcatを終了します。

前回との違いに注意してください(図10-9を参照)。まず、入力した文字は二重に表示されてはいません。今回はcatからの出力がファイルに出力(リダイレクト)されたためです。リダイレクトは、haiku.txtという名前を付けて作成した新しいファイルに対して行われました。

このファイルはcatを開始したときの現在のディレクトリにあります(ディレクトリ内のファイル一覧を画面で見るには、lsと入力してください)。

プロンプトから次のように入力してcatを実行すると、

cat haiku.txt

そのファイルを読み込み、内容を画面に表示することができます。

注意ファイルを上書きしないでください
 

出力をファイルにリダイレクトするときは、既存のファイルを上書きしがちなので、十分注意してください。ファイルを置き換えたい場合を除き、作成するファイルと同じ名前のファイルが存在していないことを確認してください。

今度は、別のファイルに出力をリダイレクトし、このファイルにtanka.txtという名前を付けましょう。次のように入力します。

[newuser@localhost newuser]$ cat > tanka.txt
天の原
ふりさけみれば
春日なる
三笠の山に
出でし月かも

ここで、空白行にカーソルを移動して、Ctrl-Dキーを押してcatを終了します。

次のように入力して、もう1度ファイルの内容を調べます。

cat tanka.txt

今度は、catを使って、tanka.txthaiku.txtの内容を結合し、haikutankaという新しいファイルにリダイレクトしてみましょう(図10-10の例を参照)。次のように入力します。

[newuser@localhost newuser]$ cat haiku.txt tanka.txt > haikutanka

図 10-10. ファイルの結合と出力のリダイレクト

ここで、この結果を確認してみましょう。次のように入力します。

[newuser@localhost newuser]$ cat haikutanka

以下のような内容が表示されるはずです。

[newuser @localhost newuser]$ cat haikutanka
やせ蛙
負けるな、一茶
ここにあり
天の原
ふりさけみれば
春日なる
三笠の山に
出でし月かも
[newuser @localhost newuser]$

catによって、まずhaiku.txtが、次にtanka.txtの内容が、新しいファイルに出力されたことを確認できます。

ティップcatによるファイルの結合
 

catを使用して短いファイルを作成し結合することは、emacsのようなテキストエディタの使用に代わる便利な方法です。

標準出力の追加リダイレクト

出力リダイレクトを使用すると、既存のファイルの終わりに新しい情報を追加することができます。「>」記号を使用する場合と同じように、シェルに対して、情報を標準出力以外に送るように指示することになります。

ただし、「>>」を使用した場合には、情報は置き換わるのではなく、追加されます。

実際に試してみる方がわかりやすいでしょう。2つの作成済みファイルhaiku.txttanka.txtを、catコマンドに追加出力記号を指定して連結しましょう。tanka.txtの情報をhaiku.txtの情報に追加するには、次のように入力します。

cat tanka.txt >> haiku.txt

次のように入力して、結果を確認してみましょう。

cat haiku.txt

既存のhaiku.txtの内容の後に、tanka.txtの内容が加えられています。

ここで入力したコマンドがシステムに指示した内容は、「tanka.txtファイルからの出力をhaiku.txtファイルに追加しなさい」というものです。

既存のファイルを使用して出力を追加することにより、ファイルを新規作成した場合と比較して、いくつかのステップ(とディスクの領域)を省くことができました。

ファイルhaiku.txtsaturdayの内容を比較して、同じであることを確認しましょう。比較を行うには、次のように入力します。

cat haiku.txt; cat haikutanka

最初にhaiku.txt、その後にhaikutankaの内容が表示されます(図10-11を参照)。

注意追加と置き換え
 

出力を既存のファイルに追加する場合は、必ず2つの不等号(>>)を使用してください。間違って「>」を使うと、追加先のファイルにあった情報は消えてしまいます。

図 10-11. コマンドの連結とファイルの比較

標準入力のリダイレクト

標準出力のリダイレクトだけではなく、標準入力についても同じようにリダイレクトを実行することができます。

標準入力リダイレクト記号の「<」を使用すると、コマンドの入力元としてファイルを使用するように、とシェルに伝えることになります。

作成済みのファイルを使用して、実際に試してみましょう。シェルプロンプトで以下のように入力します。

cat < haiku.txt

catコマンドとファイル名を不等号(<)でつないだため、cathaiku.txtからの出力を読み込み、その内容を出力します。