ここではファイルの先頭部分を取り出すhead
コマンドと末尾部分を取り出すtail
コマンドについてを扱う。
各行に番号のみを含んだテキストファイルをseq
コマンドで作っておくことにする。
$ seq 10 > num.txt
全体は下のようになる。
$ cat num.txt
1
2
3
4
5
6
7
8
9
10
同様にしてファイルをもう1つ作成しておくことにする。
$ seq 11 20 > num2.txt
$ cat num2.txt
11
12
13
14
15
16
17
18
19
20
引数の場所にあるファイルを開いてオプションで指定した行数(-n [行数]
)あるいはバイト数(-c [バイト数]
)だけを先頭から取り出して標準出力へ出力する。
バイト数指定の場合は後ろにk
やm
を付けてそれぞれKiB単位とMiB単位で指定することもできる。
(行数指定)
$ head -n 2 num.txt
1
2
(バイト数指定・下の例では3つの文字と2つの改行で5バイト)
$ head -c 5 num.txt
1
2
3(ここで改行されずに終了)
いずれのオプションも付けない場合は先頭の10行が出力される(-n 10
と同様の動作)。
複数のファイルが引数で指定されたときには各ファイルの内容の前にどのファイルかが示されるが、-q
オプションを付けることで表示しないようにもできる。
(複数のファイル・ファイル名表示あり)
$ head -n 2 num.txt num2.txt
==> num.txt <==
1
2
==> num2.txt <==
11
12
(複数のファイル・ファイル名表示なし)
$ head -q -n 2 num.txt num2.txt
1
2
11
12
また、引数を付けない場合は標準入力が用いられ、他のコマンドからの出力をパイプを用いて処理することもできる。
(ファイルを標準入力から開く)
$ head -n 3 < num.txt
1
2
3
(他のコマンドからの出力を処理する)
$ seq 100 | head -n 5
1
2
3
4
5
-n
オプションで行数指定を行う際に-
付きで行数を指定すると、末尾の[指定した数]行を除いた部分を出力する。
$ head -n -7 num.txt
1
2
3
この指定形式はバイト数指定(-c
オプション)でも使用できる(末尾の指定バイト数を除いたものが得られる)。
tail
コマンドはファイルの末尾から処理を行う以外はhead
と同様の使い方と動作で、オプションを付けないと末尾10行が出力される。
(行数指定)
$ tail -n 2 num.txt
9
10
(バイト数指定・下の例では3つの文字と2つの改行で5バイト)
$ tail -c 5 num.txt
9
10
(複数のファイル・ファイル名表示あり)
$ tail -n 2 num.txt num2.txt
==> num.txt <==
9
10
==> num2.txt <==
19
20
(複数のファイル・ファイル名表示なし)
$ tail -q -n 2 num.txt num2.txt
9
10
19
20
-n
オプションで行数指定を行う際に+
付きで行数を指定すると、先頭からみた[指定した数]行目から末尾までを出力する。
$ tail -n +7 num.txt
7
8
9
10
この指定形式はバイト数指定(-c
オプション)でも使用できる(先頭からみた指定バイト目から末尾までが得られる)。
tail
にはhead
とは違った使い方があり、--follow
(-f
)オプションを付けて実行すると、Ctrl-c
を押すなどして終了するまでの間そのファイルを監視し続けて、データが末尾に追記されると、自動的に新しい末尾の部分に表示が切り替わる。
tail
がファイルを監視しているときに対象ファイルが別名へ変更されたとき、-f
もしくは--follow=descriptor
の指定ではそのまま監視状態が続くが、--follow=name
の場合は元のパス名でアクセスできなくなるとメッセージが出て、その後で再び対象ファイルが現れたときにこれが開かれて終端の追跡が再開される。
--follow=name
オプションに--retry
オプションを追加するか、代わりに-F
オプション(--follow=name
--retry
と等価)を付けると、対象のファイルが無い状態でも監視が開始できる(ファイルが現れたタイミングで終端の追跡が開始され、表示が切り替わる)。