ファイル内容を表示するcatコマンドを極める

catコマンドは、ひとことで言えば「ファイル内容を表示する」コマンドで、さまざまな場面で頻繁に利用されるLinuxの代表的なコマンドです。

ちなみに、「連結する」を意味するconcatenateが名前の由来です。

catをもう少しだけ詳しくいうと「ファイルの内容を連結して標準出力に出力する」コマンドです。

catは複数のファイルを指定すると順番に(連結して)出力します。さらに、それらの出力をリダイレクトすることで、複数のファイルを結合(≒連結)できます

このように、catは本来の意味では複数のファイルを連結するコマンドなのですが、単一のファイルを標準出力に出力する(=単一のファイルの内容を表示する)ために使われることが多いコマンドです。

catコマンドの基本〜ファイル内容を表示する

$ cat [オプション] [ファイル名]

が代表的な書式です。指定するオプションによって出力内容が変化します。オプションの内容については次節で解説します。

catコマンドのオプション

catコマンドには以下のようなオプションがあります。

オプション説明
-n,–number行番号を付けて表示
-b, –number-nonblank空行以外に行番号を付けて表示
-s, –square-blank連続した空行を1行の空行にする
-E, –show-ends行末に「$」を表示
-T, –show-tabsタブ文字を「^I」で表示

viで以下のように作成したテキストファイルをcatコマンドにオプションを付けて表示してみましょう。

$ 1 catコマンドは、ひとことで言えば、「ファイル内容を表示する」コマンドで、さまざまな場面で頻繁に利用
    されるLinuxの代表的なコマンドです。
  2
  3 少しだけ詳しくいうと、「ファイルの内容を標準出力に出力する」コマンドです。
  4
  5
  6     catは、「連結する」を意味するconcatenateを省略したものです。
  7
  8 catは、複数のファイルを指定すると、順番に(連結して)出力します。
  9     また、それらの出力をリダイレクトすることで、複数のファイルを結合(≒連結)できることからその呼び名
    が付いたようです。

cat [ファイル] //オプション無し

オプション無しの場合。改行もタブも反映されています。

$ cat cat.txt
catコマンドは、ひとことで言えば、「ファイル内容を表示する」コマンドで、さまざまな場面で頻繁に利用されるLinuxの代表的なコマンドです。

少しだけ詳しくいうと、「ファイルの内容を標準出力に出力する」コマンドです。


    catは、「連結する」を意味するconcatenateを省略したものです。

catは、複数のファイルを指定すると、順番に(連結して)出力します。
    また、それらの出力をリダイレクトすることで、複数のファイルを結合(≒連結)できることからその呼び名が付いたようです。

cat -n [ファイル] //行番号を付けて表示

行頭に行番号を表示します。空行もカウントされています。

$ cat -n cat.txt
     1	catコマンドは、ひとことで言えば、「ファイル内容を表示する」コマンドで、さまざまな場面で頻繁に利用されるLinuxの代表的なコマンドです。
     2
     3	少しだけ詳しくいうと、「ファイルの内容を標準出力に出力する」コマンドです。
     4
     5
     6	    catは、「連結する」を意味するconcatenateを省略したものです。
     7
     8	catは、複数のファイルを指定すると、順番に(連結して)出力します。
     9	    また、それらの出力をリダイレクトすることで、複数のファイルを結合(≒連結)できることからその呼び名が付いたようです。

cat -b [ファイル] //空行以外に行番号を付けて表示

空行は無視して行番号を付けて表示します。空行そのものはそのままです。

$ cat -b cat.txt
     1	catコマンドは、ひとことで言えば、「ファイル内容を表示する」コマンドで、さまざまな場面で頻繁に利用されるLinuxの代表的なコマンドです。

     2	少しだけ詳しくいうと、「ファイルの内容を標準出力に出力する」コマンドです。


     3	catは、「連結する」を意味するconcatenateを省略したものです。

     4	catは、複数のファイルを指定すると、順番に(連結して)出力します。
     5	また、それらの出力をリダイレクトすることで、複数のファイルを結合(≒連結)できることからその呼び名が付いたようです。

cat -s [ファイル] //連続した空行を1行の空行にする

2行以上の空行を1行の空行にして表示しています。

$ cat -s cat.txt
catコマンドは、ひとことで言えば、「ファイル内容を表示する」コマンドで、さまざまな場面で頻繁に利用されるLinuxの代表的なコマンドです。

少しだけ詳しくいうと、「ファイルの内容を標準出力に出力する」コマンドです。

	catは、「連結する」を意味するconcatenateを省略したものです。

catは、複数のファイルを指定すると、順番に(連結して)出力します。
	また、それらの出力をリダイレクトすることで、複数のファイルを結合(≒連結)できることからその呼び名が付いたようです。

cat -E [ファイル] //行末に$を表示

行末に$を追加しています。空行は行頭が$になります。

$ cat -E cat.txt
catコマンドは、ひとことで言えば、「ファイル内容を表示する」コマンドで、さまざまな場面で頻繁に利用されるLinuxの代表的なコマンドです。$
$
少しだけ詳しくいうと、「ファイルの内容を標準出力に出力する」コマンドです。$
$
$
catは、「連結する」を意味するconcatenateを省略したものです。$
$
catは、複数のファイルを指定すると、順番に(連結して)出力します。$
また、それらの出力をリダイレクトすることで、複数のファイルを結合(≒連結)できることからその呼び名が付いたようです。$

cat -T [ファイル] //タブ文字を^Iで表示

タブを^Iという文字列に置き換えます

$ cat -T cat.txt
catコマンドは、ひとことで言えば、「ファイル内容を表示する」コマンドで、さまざまな場面で頻繁に利用されるLinuxの代表的なコマンドです。

少しだけ詳しくいうと、「ファイルの内容を標準出力に出力する」コマンドです。


^Icatは、「連結する」を意味するconcatenateを省略したものです。

catは、複数のファイルを指定すると、順番に(連結して)出力します。
^Iまた、それらの出力をリダイレクトすることで、複数のファイルを結合(≒連結)できることからその呼び名が付いたようです。

cat [-] //ファイル名を指定しない場合

ファイル名(=引数)を指定しない使い方もできます。

catコマンド入力後、エンターキーでキーボードからの入力を待つ状態になります。その状態で何らかの入力を行うと、入力した物と同じ内容が次の行に出力されます。

このモードから抜けるには「ctrl+d」を入力します。

$ cat
この度は大変お世話になっております (← キーボードからの入力+enter)
この度は大変お世話になっております (← コマンドからの出力)

(ctrl+dで終了)
$

ちなみに、ファイル名が「-」の場合も同様の動きをします。
下の例はキーボードで入力した内容をリダイレクト[>]してファイルを作成後、追記[>>]するまでの流れです。

$ cat - > cat1.txt
catはLinuxの代表的なコマンドです。(← キーボードからの入力+enter)
(ctrl+d)
$ cat cat1.txt
catはLinuxの代表的なコマンドです。

$ cat - >> cat1.txt
連結するを意味するconcatenateを省略しています。(← キーボードからの入力+enter)
(ctrl+d)
$ cat cat1.txt
catはLinuxの代表的なコマンドです。
連結するを意味するconcatenateを省略しています。

複数のオプションの組合せ

オプションは複数組み合わせて使用可能です。

$ cat -ns cat.txt
     1	catコマンドは、ひとことで言えば、「ファイル内容を表示する」コマンドで、さまざまな場面で頻繁に利用されるLinuxの代表的なコマンドです。
     2
     3	少しだけ詳しくいうと、「ファイルの内容を標準出力に出力する」コマンドです。
     4
     5		catは、「連結する」を意味するconcatenateを省略したものです。
     6
     7	catは、複数のファイルを指定すると、順番に(連結して)出力します。
     8		また、それらの出力をリダイレクトすることで、複数のファイルを結合(≒連結)できることからその呼び名が付いたようです。
$ cat -nsE cat.txt
     1	catコマンドは、ひとことで言えば、「ファイル内容を表示する」コマンドで、さまざまな場面で頻繁に利用されるLinuxの代表的なコマンドです。$
     2	$
     3	少しだけ詳しくいうと、「ファイルの内容を標準出力に出力する」コマンドです。$
     4	$
     5		catは、「連結する」を意味するconcatenateを省略したものです。$
     6	$
     7	catは、複数のファイルを指定すると、順番に(連結して)出力します。$
     8		また、それらの出力をリダイレクトすることで、複数のファイルを結合(≒連結)できることからその呼び名が付いたようです。$

エスパくん

ちなみに、ここまで色々なオプションの実行例を紹介してきましたが、LPI-JapanのLinuCレベル1認定本でも初心者向けの入門書でもcatコマンドのオプションで紹介されているのは行番号を付与する「-n」ぐらいです。他は覚えられれば便利ですが、参考程度にしていただいて問題ないと思います。
書籍名cat紹介ページ紹介しているオプション
Linux教科書(あずき本)138-n
最短突破合格教本140-n
スピードマスター(白本)73-n
新しいLinuxの教科書76-n
Linuxコマンド入門教室184-n

catコマンドの応用〜ファイル内容の連結や標準入出力との組合せ

複数のファイルの内容を表示する

ファイル名[=引数]を複数指定すると結合[連結]して表示します。

$ cat a.txt
これはファイルa.txtの内容です。
$ cat b.txt
これはファイルb.txtの内容です。

$ cat a.txt b.txt
これはファイルa.txtの内容です。
これはファイルb.txtの内容です。

$ cat a.txt b.txt > c.txt
$ cat c.txt
これはファイルa.txtの内容です。
これはファイルb.txtの内容です。

パイプやリダイレクトと組合せ

パイプやリダイレクトと組み合わせれば必要な情報だけ取り出してファイルとして記録できます。

(パスワードファイルの1行目だけを標準出力)
$ cat /etc/passwd | head -n 1
root:x:0:0:root:/root:/bin/bash

(パスワードファイルの最終3行だけを標準出力)
$ cat -n /etc/passwd | tail -n 3
    42	tcpdump:x:72:72::/:/sbin/nologin
    43	ymizusawa:x:1000:1000:yasutaka mizusawa:/home/ymizusawa:/bin/bash
    44	cockpit-ws:x:988:980:User for cockpit-ws:/nonexisting:/sbin/nologin
(システム情報ファイルの冒頭6行目までを出力してファイルに保存)
$ cat /etc/os-release | head -n 6 > os-name.txt
$ cat -n os-name.txt
     1	NAME="CentOS Linux"
     2	VERSION="7 (Core)"
     3	ID="centos"
     4	ID_LIKE="rhel fedora"
     5	VERSION_ID="7"
     6	PRETTY_NAME="CentOS Linux 7 (Core)"

ファイルを標準入力に入力して内容を表示

キーボードの代わりにファイルを標準入力につなぐ、入力リダイレクトと組み合わせることもできます。

以下の例は上で作成したファイルを入力リダイレクト[<]してcatを実行しています。

$ cat < os-name.txt
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"

上記の結果は、普通にcatコマンドで同ファイルを引数に実行した場合と全く同じです。

$ cat os-name.txt
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"

実はこの2つには内部の動作に違いがあります。前者の入力ダイレクトの場合はシェル(bash)がファイルを開いている(標準入力にファイルをリダイレクトしている)のに対して、後者はcatコマンドがファイルを開いています

存在しないファイルを指定して実験してみましょう。

$ cat < d.txt
-bash: d.txt: そのようなファイルやディレクトリはありません

$ cat d.txt
cat: d.txt: そのようなファイルやディレクトリはありません

前者はシェル(bash)で後者はcatと、エラーメッセージの出所が異なっているのがわかります。

ヒアドキュメント

以下の例では、ヒアドキュメント「<<」の直後に指定する文字列「EOF(end of fileを意味)」を入力した時点で終了し、その内容をファイル出力しています。

$ cat - << EOF > heredoc.txt
> cat -n(← enter)
> はよく使いますが、(← enter)
> cat -b(← enter)
> も便利なのにわすれがち(← enter)
> EOF(← enter)
$
$ cat heredoc.txt
cat -n
はよく使いますが、
cat -b
も便利なのにわすれがち

エスパくん

catコマンドはファイル単体の内容を出力、複数のファイルの連結、リダイレクトやパイプラインと組合せて使えるとても便利なコマンドです。便利ということはそれだけ重要ということなのでしっかり習得しておきましょう。

参考

catはテキストファイルの内容以外は表示できない

なお、catコマンドはテキストファイルの内容以外は表示できません。厳密には表示できないわけでは無いのですが、バイナリファイルを指定すると意味が全く分からない文字化けの状態になります。大きなサイズのファイルだと表示が終わるまで時間がかかる場合があるので、ctrl+dなどで強制終了する必要があります。

catの類似コマンド

catとスペルが逆のtacコマンドはファイルの内容を最終行から1行目まで逆に表示します。

$ tac [ファイル名]
$ cat heredoc.txt
cat -n
はよく使いますが、
cat -b
も便利なのにわすれがち

$ tac heredoc.txt
も便利なのにわすれがち
cat -b
はよく使いますが、
cat -n

revコマンドは、行ごとに入力された文字を逆に並べたものを出力します。

$ rev [ファイル名]
$ rev heredoc.txt
n- tac
、がすまい使くよは
b- tac
ちがれすわにのな利便も

エスパくん

tacもrevも重要コマンドではありませんが、いずれにしても使いどころが難しいですね。