ファイルの先頭や末尾を取り出すコマンド(headとtail)の概要と使い方

Last modified: 2021-08-09

ここではファイルの先頭部分を取り出す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 [バイト数])だけを先頭から取り出して標準出力へ出力する。

バイト数指定の場合は後ろにkmを付けてそれぞれ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

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と等価)を付けると、対象のファイルが無い状態でも監視が開始できる(ファイルが現れたタイミングで終端の追跡が開始され、表示が切り替わる)。

  • 使用したバージョン
    • coreutils 8.21