tailで表示する行数を指定するには-nを使う。-n 5は末尾5行、-n +5は5行目以降を表示する。+の有無で意味が変わる。

ファイルの指定行以降を表示したい

テキストファイルの先頭N行をスキップして、N行目以降を表示したい。

例えば以下のような10行のファイルがある。

1
2
3
4
5
6
7
8
9
10

このファイルから5行目以降を表示したい。

5
6
7
8
9
10

tail -n +N

tailコマンドに-n +Nオプションをつけると、N行目以降の内容を表示する。

$ tail -n +5 numbers.txt
5
6
7
8
9
10

-n +5オプションで5行目以降(5行目から最後まで)を表示している。

末尾を表示する通常のtail

通常のtailコマンドは末尾から指定した行数を表示する。

$ tail -n 5 numbers.txt
6
7
8
9
10

-n 5オプション(または-5)で末尾5行を表示している。

+記号の有無の違い

-nオプションでの+記号の有無で動作が変わる。

  • -n N(または-n -N): 末尾N行を表示
  • -n +N: N行目以降を表示
# 末尾3行を表示
$ tail -n 3 numbers.txt
8
9
10

# 3行目以降を表示
$ tail -n +3 numbers.txt
3
4
5
6
7
8
9
10

CSVファイルのヘッダーをスキップ

CSVファイルの1行目のヘッダーをスキップしてデータ行のみを処理する場合に便利である。

Name,Age,City
Alice,25,Tokyo
Bob,30,Osaka
Charlie,28,Kyoto
# ヘッダー行をスキップして2行目以降を表示
$ tail -n +2 data.csv
Alice,25,Tokyo
Bob,30,Osaka
Charlie,28,Kyoto

ヘッダーをスキップした後、パイプで他のコマンドに渡してデータ処理を行える。

# ヘッダーをスキップしてカンマ区切りでカラムを取得
$ tail -n +2 data.csv | cut -d',' -f2
25
30
28

head との組み合わせ

headtailを組み合わせると、ファイルの特定の範囲の行を抽出できる。

# 3行目から5行目を表示(3行目以降を取得してその最初の3行を表示)
$ tail -n +3 numbers.txt | head -n 3
3
4
5

tail -n +3で3行目以降を取得し、head -n 3でその最初の3行を表示している。

標準入力からの使用

パイプでコマンドの出力結果から指定行以降を表示できる。

$ seq 1 20 | tail -n +11
11
12
13
14
15
16
17
18
19
20

seq 1 20で1から20までの数値を生成し、tail -n +11で11行目以降を表示している。

末尾のN行を除いて表示する

末尾から数行を取り除きたい場合はhead-n -Nを使う。tailでは指定できない。

$ head -n -3 numbers.txt
1
2
3
4
5
6
7

-n -3で末尾3行を除いた残りを表示している。

バイト数で指定する

-cを使うと行ではなくバイト数で指定する。-nと同じく+の有無で意味が変わる。

$ printf "abcdefghij" > chars.txt

# 末尾3バイトを表示
$ tail -c 3 chars.txt
hij

# 3バイト目以降を表示
$ tail -c +3 chars.txt
cdefghij

macOSでの動作

本記事の内容はGNU coreutilsのtailで確認している。macOS標準のtailはBSD版だが、-n +N-n Nは同じ動作である。

$ tail -n +5 numbers.txt
5
6
7
8
9
10