ファイルまたは標準入力の内容をそのまま標準出力に出力するコマンド。ファイルの中身を確認するのによく使う。または、複数のファイルを指定することで、複数のファイルを連結するのに使う。
cat
の反対はtac
(冗談ではなく、ほんとうにこういうコマンドがある)。
入力の全部ではなく先頭の部分のみを出力したい場合はhead
コマンドを、最後の部分のみを出力したい場合はtail
コマンドを使う。
入力の全部をターミナル上でスクロールしながら見るにはless
コマンドを使う。
Coreutilsというパッケージに入っているので、CentOSにもUbuntuにも始めから入っている。
-A
-vET
と同じで、行末、タブ、CRを可視化する。-b
-n
と似ているが-b
は空行には行番号を付けない。-E
$
を追加して出力する。--help
-n
less
でこれに相当するのは-N
)-s
-n
と併用した場合は結果として行番号がずれる。-T
^I
として出力する。-v
^M
として出力する。--version
--
というパラメータを渡すとそれ以降のパラメータをオプションではなくファイル名とみなしてくれるので、-
で始まるファイル名を扱いたい場合に使うとよい。
cat
だとターミナル上を一瞬で流れてしまうので、最後の1画面分以外は見ることができない。
ターミナルとしてWindowsのTera Termなどを使っていれば、ターミナルのスクロールバーで上のほうを確認できるかもしれない。
または、tmuxなどを使っていれば、tmuxのコマンドでスクロールさせ、上のほうを確認できるかもしれない。
ただ大抵はless
コマンドを使うのが楽である。オススメはless
に オプション-XF
を付けること。
$ less -XF foo.txt
-X
はless
を終了した後も最後に表示していた部分をターミナル上に残す。これがないとターミナルをクリアしてしまう。
-F
はファイルが短くて1画面に収まる場合はcat
と同じ挙動、つまり画面に表示した後、直ちにコマンドを終了する。
cat
を使ったファイルの作成と bash, zsh での機能2015/10/06シェルからcat
を使ってファイルを作成するには、以下のような方法がある。
$ cat > foo.txthogehoge# ここで Ctrl+D を押せば、標準入力が閉じられて、# 入力した内容がファイルに書きだされる。
ただ、これは zsh ではcat
を使わなくても以下のようにできる。
$ > foo.txthogehoge# ここで 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
cat
の使いみち2015/10/06行数が膨大なテキストファイルに対してなにかの処理をしたい。
処理に時間がかかってしまうが、その “なにか” を処理させるワンライナーが正しいかどうか不安で何度か試行錯誤する必要がある場合に、試行錯誤中は、テキストファイル全体を処理するのではなく、head
でファイルの一部だけを処理してみる。
ワンライナーが完成したときに、コマンド履歴のhead
をcat
に書き換えるだけで処理を完成させることができる。
“なにか” が仮に文字コード変換だとすると、こんな感じ。
## テキストファイルの文字コードがわからないが、とにかくUTF-8にしたい$ head huge.txt | nkf --guessCP932 (CRLF)## CP932 というのをUTF-8にするにはどうしたらいいんだっけ?$ head huge.txt | nkf -sW...## 違った、文字化けしちまった、こっちかな?$ head huge.txt | nkf -Sw...## 合ってた。さて、改行コードはどうなってる?$ head huge.txt | nkf -Sw | nkf --guessUTF-8 (CRLF)## 改行コードも直したい$ head huge.txt | nkf -Sw -Lu | nkf --guessUTF-8 (LF)## OK。じゃあ、本番$ cat huge.txt | nkf -Sw -Lu > result.txt
最後の本番のコマンドはnkf -Sw -Lu huge.txt > result.txt
でもよいのだが、直前のコマンド履歴のhead
をcat
に書き換えるだけのほうが、タイピングが楽で間違えないのである。このときcat
はほとんど意味のある仕事をしないが、タイピングを楽にすることに意味がある。
-s
オプションで簡単にできる。
$ cat foo.txtabcdef$ cat -s foo.txtabcdef