cat コマンド 2015/10/11
ファイルまたは標準入力の内容をそのまま標準出力に出力するコマンド。ファイルの中身を確認するのによく使う。または、複数のファイルを指定することで、複数のファイルを連結するのに使う。
cat
の反対は tac
(冗談ではなく、ほんとうにこういうコマンドがある)。
入力の全部ではなく先頭の部分のみを出力したい場合はhead
コマンドを、最後の部分のみを出力したい場合はtail
コマンドを使う。
入力の全部をターミナル上でスクロールしながら見るにはless
コマンドを使う。
インストール 2016/03/17
Coreutilsというパッケージに入っているので、CentOSにもUbuntuにも始めから入っている。
オプション 2016/05/10
-A
-vET
と同じで、行末、タブ、CRを可視化する。-b
- 行番号を付加して出力する。
-n
と似ているが-b
は空行には行番号を付けない。 -E
- 各行末に
$
を追加して出力する。 --help
- ヘルプ表示
-n
- 行番号を付加して出力する。(
less
でこれに相当するのは-N
) -s
- 連続する空行を1つにまとめる。
-n
と併用した場合は結果として行番号がずれる。 -T
- タブを
^I
として出力する。 -v
- CR (0x0D) を
^M
として出力する。 --version
- バージョン表示
--
というパラメータを渡すとそれ以降のパラメータをオプションではなくファイル名とみなしてくれるので、
-
で始まるファイル名を扱いたい場合に使うとよい。
長いテキストファイルを見るには 2015/10/11
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.txt
hogehoge
# ここで Ctrl+D を押せば、標準入力が閉じられて、
# 入力した内容がファイルに書きだされる。
ただ、これは zsh では cat
を使わなくても以下のようにできる。
$ > foo.txt
hogehoge
# ここで Ctrl+D を押せば、標準入力が閉じられて、
# 入力した内容がファイルに書きだされる。
bash ではこの方法だと標準入力を端末で入力させてもらえずに、空っぽのファイルが書きだされる。ファイルが既存だった場合は、内容が削除され、強制的に空っぽのファイルになってしまう。
bash での動きは touch
に似ているが、touch
は、ファイルが既存だった場合は、内容を削除せずにタイムスタンプだけ新しくする。
複数のファイルを連結するには 2016/02/24
$ 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
を生成する。
ディレクトリの中にあるすべてのファイルをまとめて閲覧するには 2013/10/08
ディレクトリの中にサブディレクトリが存在しない場合
ls foo/* | awk '{print "echo " $1 "; cat -n " $1}' | sh | less
-> たくさんのファイルをまとめて less で閲覧するには
cat
の使いみち
2015/10/06
行数が膨大なテキストファイルに対してなにかの処理をしたい。
処理に時間がかかってしまうが、その “なにか” を処理させるワンライナーが正しいかどうか不安で何度か試行錯誤する必要がある場合に、試行錯誤中は、テキストファイル全体を処理するのではなく、head
でファイルの一部だけを処理してみる。
ワンライナーが完成したときに、コマンド履歴の head
を cat
に書き換えるだけで処理を完成させることができる。
“なにか” が仮に文字コード変換だとすると、こんな感じ。
## テキストファイルの文字コードがわからないが、とにかく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
でもよいのだが、直前のコマンド履歴の head
を cat
に書き換えるだけのほうが、タイピングが楽で間違えないのである。このとき cat
はほとんど意味のある仕事をしないが、タイピングを楽にすることに意味がある。
連続する空行を1行にまとめるには 2016/02/05
-s
オプションで簡単にできる。
$ cat foo.txt
abc
def
$ cat -s foo.txt
abc
def