cat コマンド

ファイルまたは標準入力の内容をそのまま標準出力に出力するコマンド。ファイルの中身を確認するのによく使う。または、複数のファイルを指定することで、複数のファイルを連結するのに使う。

catの反対は tac(冗談ではなく、ほんとうにこういうコマンドがある)。

入力の全部ではなく先頭の部分のみを出力したい場合はheadコマンドを、最後の部分のみを出力したい場合はtailコマンドを使う。

入力の全部をターミナル上でスクロールしながら見るにはlessコマンドを使う。

インストール

Coreutilsというパッケージに入っているので、CentOSにもUbuntuにも始めから入っている。

オプション

-A
-vET と同じで、行末、タブ、CRを可視化する。
-b
行番号を付加して出力する。-n と似ているが -b は空行には行番号を付けない。
-E
各行末に $ を追加して出力する。
--help
ヘルプ表示
-n
行番号を付加して出力する。(less でこれに相当するのは -N)
-s
連続する空行を1つにまとめる。-n と併用した場合は結果として行番号がずれる。
-T
タブを ^I として出力する。
-v
CR (0x0D) を ^M として出力する。
--version
バージョン表示

-- というパラメータを渡すとそれ以降のパラメータをオプションではなくファイル名とみなしてくれるので、 - で始まるファイル名を扱いたい場合に使うとよい。

スポンサーリンク

長いテキストファイルを見るには

cat だとターミナル上を一瞬で流れてしまうので、最後の1画面分以外は見ることができない。

ターミナルとしてWindowsのTera Termなどを使っていれば、ターミナルのスクロールバーで上のほうを確認できるかもしれない。

または、tmuxなどを使っていれば、tmuxのコマンドでスクロールさせ、上のほうを確認できるかもしれない。

ただ大抵はlessコマンドを使うのが楽である。オススメは less に オプション -XF を付けること。

$ less -XF foo.txt

-Xlessを終了した後も最後に表示していた部分をターミナル上に残す。これがないとターミナルをクリアしてしまう。

-F はファイルが短くて1画面に収まる場合は cat と同じ挙動、つまり画面に表示した後、直ちにコマンドを終了する。

cat を使ったファイルの作成と bash, zsh での機能

シェルから cat を使ってファイルを作成するには、以下のような方法がある。

$ cat > foo.txt
hogehoge
# ここで Ctrl+D を押せば、標準入力が閉じられて、
# 入力した内容がファイルに書きだされる。

ただ、これは zsh では cat を使わなくても以下のようにできる。

$ > foo.txt
hogehoge
# ここで Ctrl+D を押せば、標準入力が閉じられて、
# 入力した内容がファイルに書きだされる。

bash ではこの方法だと標準入力を端末で入力させてもらえずに、空っぽのファイルが書きだされる。ファイルが既存だった場合は、内容が削除され、強制的に空っぽのファイルになってしまう。

bash での動きは touch に似ているが、touch は、ファイルが既存だった場合は、内容を削除せずにタイムスタンプだけ新しくする。

複数のファイルを連結するには

$ cat foo.txt bar.txt baz.txt > output.txt

とすると、3つのファイルを連結して output.txt というファイルを生成する。

標準入力とファイルを組み合わせて連結するには、標準入力の位置に - を置く。

$ cat foo.txt - baz.txt > output.txt

とすると、foo.txt の後ろに標準入力の内容、その後に baz.txt の中身を連結して、 output.txt を生成する。

ディレクトリの中にあるすべてのファイルをまとめて閲覧するには

ディレクトリの中にサブディレクトリが存在しない場合

ls foo/* | awk '{print "echo " $1 "; cat -n " $1}' | sh | less

-> たくさんのファイルをまとめて less で閲覧するには

cat の使いみち

行数が膨大なテキストファイルに対してなにかの処理をしたい。

処理に時間がかかってしまうが、その “なにか” を処理させるワンライナーが正しいかどうか不安で何度か試行錯誤する必要がある場合に、試行錯誤中は、テキストファイル全体を処理するのではなく、headでファイルの一部だけを処理してみる。

ワンライナーが完成したときに、コマンド履歴の headcat に書き換えるだけで処理を完成させることができる。

“なにか” が仮に文字コード変換だとすると、こんな感じ。

## テキストファイルの文字コードがわからないが、とにかくUTF-8にしたい
$ head huge.txt | nkf --guess
CP932 (CRLF)

## CP932 というのをUTF-8にするにはどうしたらいいんだっけ?
$ head huge.txt | nkf -sW
...

## 違った、文字化けしちまった、こっちかな?
$ head huge.txt | nkf -Sw
...

## 合ってた。さて、改行コードはどうなってる?
$ head huge.txt | nkf -Sw | nkf --guess
UTF-8 (CRLF)

## 改行コードも直したい
$ head huge.txt | nkf -Sw -Lu | nkf --guess
UTF-8 (LF)

## OK。じゃあ、本番
$ cat huge.txt | nkf -Sw -Lu > result.txt

最後の本番のコマンドは nkf -Sw -Lu huge.txt > result.txt でもよいのだが、直前のコマンド履歴の headcat に書き換えるだけのほうが、タイピングが楽で間違えないのである。このとき cat はほとんど意味のある仕事をしないが、タイピングを楽にすることに意味がある。

連続する空行を1行にまとめるには

-sオプションで簡単にできる。

$ cat foo.txt
abc


def
$ cat -s foo.txt
abc

def

行番号を表示するには

-> テキストファイルに行番号を付けるには

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク