こちらからSWELLを購入できます 詳しくはこちら

【Linux】headコマンド完全ガイド ファイルの先頭を表示する

  • URLをコピーしました!

今回はLinuxコマンドであるheadコマンドについて解説します

headコマンドは、ファイルやコマンドの出力の先頭部分(最初の数行や数バイト)だけを表示するコマンドです
大きなログの中身をさっと確認したり、CSVのヘッダーを見たり、ほかのコマンドの結果を上位だけに絞ったりと、毎日のように使う場面があるので、ぜひ覚えて帰ってくださいね!
※注 本文の△は半角スペースに置き換えてください。わかりやすくするために△で記述してます

スポンサーリンク
目次

headコマンドとは??

headコマンドは、ファイルの先頭部分を表示するコマンドです
名前は英語の「head(頭)」が由来で、オプションを付けずに実行すると、ファイルの先頭10行を表示します
ファイルを最後まで読まずに必要な分だけ読んで終わるので、数百万行あるような大きなファイルでもすぐに結果が返ってきます
ファイル名を指定しないときは、パイプなどで渡された標準入力の先頭を表示します
反対にファイルの末尾を表示するのがtailコマンドで、headと組み合わせて使うこともよくあります
この記事の実行結果は、GNU coreutils 9.4のhead(Ubuntu 24.04)を一般ユーザー(user)で実行して確認しています

headコマンドの主なオプション

headコマンドの主なオプションは次のとおりです

オプション意味
-n (–lines)表示する行数を指定するオプション
-c (–bytes)行数ではなく、バイト数で先頭部分を表示するオプション
-q (–quiet, –silent)複数のファイルを指定したときに出る「==>△ファイル名△<==」という見出しを表示しないオプション
-v (–verbose)-qとは反対に、ファイルを1つだけ指定したときでも、ファイル名の見出しを必ず表示するオプション

ここからは、テスト用のディレクトリhead-testの中に練習用ファイルを作って説明します
次のコマンドで同じファイルを作れるので、一緒に試してみてください

事前準備(テスト用ディレクトリの作成)
mkdir△head-test
cd△head-test
printf△”2026-11-01△09:00:01△INFO△server△started\n2026-11-01△09:00:05△INFO△GET△/index.html△200\n2026-11-01△09:01:12△INFO△GET△/login△200\n2026-11-01△09:01:30△WARN△slow△response△/api/items△2.3s\n2026-11-01△09:02:45△INFO△POST△/login△302\n2026-11-01△09:03:10△ERROR△db△connection△timeout\n2026-11-01△09:03:11△INFO△retry△db△connection\n2026-11-01△09:04:00△INFO△GET△/mypage△200\n”△>△access.log
printf△”2026-11-01△09:05:22△WARN△disk△usage△85%%\n2026-11-01△09:06:40△ERROR△GET△/api/orders△500\n2026-11-01△09:07:03△INFO△GET△/logout△200\n2026-11-01△09:08:15△INFO△batch△job△start\n2026-11-01△09:09:50△ERROR△batch△job△failed\n2026-11-01△09:10:02△INFO△batch△job△retry\n2026-11-01△09:11:30△INFO△batch△job△done\n”△>>△access.log
printf△”id,name,dept,score\n1,suzuki,dev,72\n2,tanaka,sales,88\n3,sato,dev,95\n4,ito,infra,64\n5,kato,infra,81\n”△>△users.csv
printf△”memo△line△1\nmemo△line△2\nmemo△line△3\n”△>△memo.txt
printf△”こんにちは世界\n”△>△ja.txt
seq△-f△”2026-11-01△batch△line△%g”△100000△>△big.log
touch△-d△”2026-11-01△12:00″△big.log
touch△-d△”2026-11-01△10:00″△access.log
touch△-d△”2026-10-30△09:00″△users.csv
touch△-d△”2026-10-28△18:00″△memo.txt
touch△-d△”2026-10-25△15:00″△ja.txt
# 作成したディレクトリの構成を確認する
ls△-l
実行結果:
total 2740
-rw-rw-r– 1 user user 647 Nov 1 10:00 access.log
-rw-rw-r– 1 user user 2788895 Nov 1 12:00 big.log
-rw-rw-r– 1 user user 22 Oct 25 15:00 ja.txt
-rw-rw-r– 1 user user 36 Oct 28 18:00 memo.txt
-rw-rw-r– 1 user user 98 Oct 30 09:00 users.csv

# ファイルの中身を確認する
cat△access.log
実行結果:
2026-11-01 09:00:01 INFO server started
2026-11-01 09:00:05 INFO GET /index.html 200
2026-11-01 09:01:12 INFO GET /login 200
2026-11-01 09:01:30 WARN slow response /api/items 2.3s
2026-11-01 09:02:45 INFO POST /login 302
2026-11-01 09:03:10 ERROR db connection timeout
2026-11-01 09:03:11 INFO retry db connection
2026-11-01 09:04:00 INFO GET /mypage 200
2026-11-01 09:05:22 WARN disk usage 85%
2026-11-01 09:06:40 ERROR GET /api/orders 500
2026-11-01 09:07:03 INFO GET /logout 200
2026-11-01 09:08:15 INFO batch job start
2026-11-01 09:09:50 ERROR batch job failed
2026-11-01 09:10:02 INFO batch job retry
2026-11-01 09:11:30 INFO batch job done
cat△users.csv
実行結果:
id,name,dept,score
1,suzuki,dev,72
2,tanaka,sales,88
3,sato,dev,95
4,ito,infra,64
5,kato,infra,81
cat△memo.txt
実行結果:
memo line 1
memo line 2
memo line 3
cat△ja.txt
実行結果:
こんにちは世界
wc△-l△big.log
実行結果:
100000 big.log

以降のコマンドは、すべてhead-testの中で実行します
big.logは10万行ある大きなファイルなので、catで全部表示するのではなく、行数だけを確認しています

-n (–lines)

表示する行数を指定するオプションです
-n△-10のように数字の前に-を付けると「最後の10行以外」を表示するという意味になります(GNU版だけの書き方で、macOSなどBSD版のheadでは使えません)

コマンド実行例
# 先頭の3行を表示する
head△-n△3△access.log
実行結果:
2026-11-01 09:00:01 INFO server started
2026-11-01 09:00:05 INFO GET /index.html 200
2026-11-01 09:01:12 INFO GET /login 200

# 長い形式のオプションで書いても同じ結果になる
head△–lines=3△access.log
実行結果:
2026-11-01 09:00:01 INFO server started
2026-11-01 09:00:05 INFO GET /index.html 200
2026-11-01 09:01:12 INFO GET /login 200

# -nを省略して「-数字」と書く古い書き方も使える
head△-3△access.log
実行結果:
2026-11-01 09:00:01 INFO server started
2026-11-01 09:00:05 INFO GET /index.html 200
2026-11-01 09:01:12 INFO GET /login 200

# 最後の10行以外を表示する(GNU版)
head△-n△-10△access.log
実行結果:
2026-11-01 09:00:01 INFO server started
2026-11-01 09:00:05 INFO GET /index.html 200
2026-11-01 09:01:12 INFO GET /login 200
2026-11-01 09:01:30 WARN slow response /api/items 2.3s
2026-11-01 09:02:45 INFO POST /login 302
# access.logは15行なので、最後の10行を除いた先頭の5行が表示されます

-c (–bytes)

行数ではなく、バイト数で先頭部分を表示するオプションです
1Kや1Mのような単位も使え、-nと同じように-c△-数字で「最後の○バイト以外」も指定できます(GNU版)

コマンド実行例
# 先頭の19バイトを表示する
head△-c△19△access.log;△echo
実行結果:
2026-11-01 09:00:01
# 行の途中で切れて改行が出力されないので、echoで改行を足しています

# 単位を付けて先頭の1K(1024バイト)を取り出し、バイト数を数える
head△-c△1K△big.log△|△wc△-c
実行結果:
1024

# 最後の1バイト(改行)以外を表示する(GNU版)
echo△”hello”△|△head△-c△-1△|△od△-c
実行結果:
0000000 h e l l o
0000005
# odで1バイトずつ表示すると、最後の改行(\n)がなくなっていることがわかります

-q (–quiet, –silent)

複数のファイルを指定したときに出る「==>△ファイル名△<==」という見出しを表示しないオプションです
複数のファイルの先頭部分を、見出しなしでつなげて表示したいときに使います

コマンド実行例
# -qなし(ファイル名の見出しが付く)
head△-n△1△access.log△users.csv
実行結果:
==> access.log <==
2026-11-01 09:00:01 INFO server started

==> users.csv <==
id,name,dept,score

# -qあり(見出しなしで続けて表示される)
head△-q△-n△1△access.log△users.csv
実行結果:
2026-11-01 09:00:01 INFO server started
id,name,dept,score

-v (–verbose)

-qとは反対に、ファイルを1つだけ指定したときでも、ファイル名の見出しを必ず表示するオプションです
どのファイルの中身なのかを、結果に残しておきたいときに便利です

コマンド実行例
head△-v△-n△2△users.csv
実行結果:
==> users.csv <==
id,name,dept,score
1,suzuki,dev,72
# ファイルが1つでも「==> users.csv <==」の見出しが付きます

基本的な使い方

headコマンドの基本的な構文は「head△オプション△ファイル名」です
オプションを付けないと先頭の10行を表示し、ファイル名を省略すると標準入力(パイプで渡された内容)を読み込みます

コマンド実行例
# オプションなしで実行する(先頭の10行が表示される)
head△access.log
実行結果:
2026-11-01 09:00:01 INFO server started
2026-11-01 09:00:05 INFO GET /index.html 200
2026-11-01 09:01:12 INFO GET /login 200
2026-11-01 09:01:30 WARN slow response /api/items 2.3s
2026-11-01 09:02:45 INFO POST /login 302
2026-11-01 09:03:10 ERROR db connection timeout
2026-11-01 09:03:11 INFO retry db connection
2026-11-01 09:04:00 INFO GET /mypage 200
2026-11-01 09:05:22 WARN disk usage 85%
2026-11-01 09:06:40 ERROR GET /api/orders 500
# access.logは15行ありますが、表示されるのは10行目までです

# 10行より短いファイルは、全部表示される
head△memo.txt
実行結果:
memo line 1
memo line 2
memo line 3

# パイプで渡された内容の先頭を表示する
seq△100△|△head△-n△3
実行結果:
1
2
3

複数のファイルの先頭をまとめて確認する

headにファイルを複数指定すると、ファイルごとに「==>△ファイル名△<==」という見出しを付けて、それぞれの先頭部分を表示します
ファイルとファイルの間には空行が入るので、どこからが次のファイルなのかひと目でわかります

複数ファイルの例
# 3つのファイルの先頭2行をまとめて表示する
head△-n△2△access.log△users.csv△memo.txt
実行結果:
==> access.log <==
2026-11-01 09:00:01 INFO server started
2026-11-01 09:00:05 INFO GET /index.html 200

==> users.csv <==
id,name,dept,score
1,suzuki,dev,72

==> memo.txt <==
memo line 1
memo line 2

# ワイルドカードで、拡張子が.logのファイルをまとめて確認する
head△-n△1△*.log
実行結果:
==> access.log <==
2026-11-01 09:00:01 INFO server started

==> big.log <==
2026-11-01 batch line 1

パイプと組み合わせて結果の先頭だけを見る

headは、ほかのコマンドの出力をパイプ(|)で受け取って、先頭の数行だけに絞り込むときによく使います
結果が長くなるコマンドでも、上位の数件だけをさっと確認できます

lsと組み合わせる(新しいファイルを確認する)

ls△-tは更新日時が新しい順に並べるので、headと組み合わせると最近更新されたファイルだけを確認できます

lsとの組み合わせ例
# 更新日時が新しい順に3つのファイル名を表示する
ls△-t△|△head△-n△3
実行結果:
big.log
access.log
users.csv
# パイプに渡すとlsは1行に1つずつ出力するので、そのままheadで数を絞れます

# 詳細表示の先頭3行を表示する
ls△-lt△|△head△-n△3
実行結果:
total 2740
-rw-rw-r– 1 user user 2788895 Nov 1 12:00 big.log
-rw-rw-r– 1 user user 647 Nov 1 10:00 access.log
# ls -lの1行目は合計(total)の行なので、ファイルは2つだけ表示されます

sortと組み合わせる(上位○件を表示する)

sortで並べ替えてからheadで先頭を取り出すと、「点数の高い上位3人」のようなランキングを作れます
CSVのヘッダー行が並べ替えの対象に混ざらないように、tail△-n△+2で2行目以降だけをsortに渡しています

sortとの組み合わせ例
# scoreが高い順に上位3人を表示する
tail△-n△+2△users.csv△|△sort△-t,△-k4△-nr△|△head△-n△3
実行結果:
3,sato,dev,95
2,tanaka,sales,88
5,kato,infra,81

# ヘッダー行を付けたまま上位3人を表示する
{△head△-n△1△users.csv;△tail△-n△+2△users.csv△|△sort△-t,△-k4△-nr△|△head△-n△3;△}
実行結果:
id,name,dept,score
3,sato,dev,95
2,tanaka,sales,88
5,kato,infra,81
# { }でまとめると、ヘッダー行の後に並べ替えた結果が続きます

grepと組み合わせる(最初の数件だけ確認する)

grepで検索した結果がたくさんあるときは、headで先頭の数件だけを表示すると、最初に起きたエラーをすぐに確認できます

grepとの組み合わせ例
# ERRORの行が何行あるか数える
grep△-c△ERROR△access.log
実行結果:
3

# 最初の2件のERRORだけを表示する
grep△ERROR△access.log△|△head△-n△2
実行結果:
2026-11-01 09:03:10 ERROR db connection timeout
2026-11-01 09:06:40 ERROR GET /api/orders 500

headコマンドの実践的な活用例

実際の現場でよく使われるheadコマンドの活用例をご紹介します

CSVのヘッダー(列名)を確認する

CSVファイルを扱う前に、1行目のヘッダーを見ると、どんな列が何番目にあるのかがわかります
trでカンマを改行に変え、cat△-nで番号を付けると、列の番号がひと目でわかります

CSVのヘッダー確認の例
# 1行目(ヘッダー)だけを表示する
head△-n△1△users.csv
実行結果:
id,name,dept,score

# 列名を1行に1つずつ、番号付きで表示する
head△-n△1△users.csv△|△tr△’,’△’\n’△|△cat△-n
実行結果:
1 id
2 name
3 dept
4 score
# scoreは4列目なので、sortの-k4やawkの$4で指定すればよいことがわかります

tailと組み合わせて○行目から○行目を取り出す

headとtailを組み合わせると、ファイルの途中の行だけを取り出せます
m行目までをheadで取り出し、その最後の部分をtailで取り出すのが基本の考え方で、n行目からm行目なら「head△-n△m△|△tail△-n△(m-n+1)」と書きます

行の範囲を取り出す例
# 5行目から7行目を取り出す(7行目までの最後の3行)
head△-n△7△access.log△|△tail△-n△3
実行結果:
2026-11-01 09:02:45 INFO POST /login 302
2026-11-01 09:03:10 ERROR db connection timeout
2026-11-01 09:03:11 INFO retry db connection

# tailから始めても同じ結果になる(5行目以降の先頭3行)
tail△-n△+5△access.log△|△head△-n△3
実行結果:
2026-11-01 09:02:45 INFO POST /login 302
2026-11-01 09:03:10 ERROR db connection timeout
2026-11-01 09:03:11 INFO retry db connection

# 10万行あるbig.logの50000行目から50002行目を取り出す
head△-n△50002△big.log△|△tail△-n△3
実行結果:
2026-11-01 batch line 50000
2026-11-01 batch line 50001
2026-11-01 batch line 50002

大きなログファイルの先頭を確認する

数十MB〜数GBあるログをcatで開くと、画面が流れ続けて止まらなくなってしまいます
headは指定した行数を読んだところで終わるので、大きなファイルでも先頭の形式をすぐに確認できます

大きなファイルの例
# ファイルのサイズと行数を確認する
ls△-lh△big.log
実行結果:
-rw-rw-r– 1 user user 2.7M Nov 1 12:00 big.log
wc△-l△big.log
実行結果:
100000 big.log

# 先頭の3行だけを確認する
head△-n△3△big.log
実行結果:
2026-11-01 batch line 1
2026-11-01 batch line 2
2026-11-01 batch line 3
# 10万行あっても、先頭の3行だけがすぐに表示されます

gzipで圧縮されたログは、zcatで展開しながらheadに渡すと、ファイルを展開して保存しなくても先頭を確認できます

圧縮されたログの例
# 事前準備:access.logを圧縮したファイルを作る(元のファイルも残す)
gzip△-kn△access.log

# 圧縮されたログの先頭2行を表示する
zcat△access.log.gz△|△head△-n△2
実行結果:
2026-11-01 09:00:01 INFO server started
2026-11-01 09:00:05 INFO GET /index.html 200

バイナリファイルの先頭を確認する

画像や圧縮ファイルのようなバイナリファイルは、先頭の数バイトにファイルの種類を表す値(マジックナンバー)が入っています
head△-cで先頭の数バイトを取り出し、odコマンド(coreutilsに含まれています)で16進数にすると、中身を安全に確認できます
バイナリファイルをそのままheadで表示すると、画面が文字化けすることがあるので、odと組み合わせるのがおすすめです

バイナリファイルの例
# gzipファイルの先頭10バイトを16進数で表示する
head△-c△10△access.log.gz△|△od△-A△d△-t△x1
実行結果:
0000000 1f 8b 08 00 00 00 00 00 00 03
0000010
# 先頭の1f 8bがgzip形式を表すマジックナンバーです

# テキストファイルの先頭16バイトを1文字ずつ表示する
head△-c△16△access.log△|△od△-c
実行結果:
0000000 2 0 2 6 – 1 1 – 0 1 0 9 : 0 0
0000020

# 練習用の圧縮ファイルを削除する
rm△access.log.gz

日本語のファイルを-cで切るときの注意

head△-cは文字数ではなくバイト数で切り取ります
UTF-8の日本語は1文字が3バイトなので、3の倍数でないところで切ると、文字の途中で切れて文字化けしてしまいます

日本語を-cで切る例
# ja.txtのバイト数を確認する(7文字×3バイト+改行1バイト)
wc△-c△ja.txt
実行結果:
22 ja.txt

# 先頭の4バイトを表示する
head△-c△4△ja.txt;△echo
実行結果:
こ�
# 「こ」の3バイトの後に「ん」の1バイト目だけが出力され、�のように文字化けします

# 4バイトの中身を16進数で確認する
head△-c△4△ja.txt△|△od△-A△d△-t△x1
実行結果:
0000000 e3 81 93 e3
0000004
# e3 81 93が「こ」で、最後のe3は「ん」の途中までしかありません

# 3の倍数(6バイト)で切れば2文字がきれいに表示される
head△-c△6△ja.txt;△echo
実行結果:
こん

文字化けの見え方は、使っている端末(ターミナル)によって変わります
日本語のファイルを先頭だけ確認したいときは、-cではなく-nで行単位で切り取るのが安全です

トラブルシューティング

headコマンドを使うときによくあるつまずきと、その解決方法です

-nと-cを間違えて、思った結果にならない

-nは行数、-cはバイト数です
「先頭3行」のつもりで-cを付けてしまうと、3バイト(半角3文字分)しか表示されません

-nと-cの違い
# -cで3を指定した場合(3バイト)
head△-c△3△users.csv;△echo
実行結果:
id,

# -nで3を指定した場合(3行)
head△-n△3△users.csv
実行結果:
id,name,dept,score
1,suzuki,dev,72
2,tanaka,sales,88

「cannot open … No such file or directory」エラーが出る

指定したファイルが存在しないと、このエラーになります
ファイル名のつづりや、今いるディレクトリ(pwdで確認できます)が合っているかを確認しましょう
日本語環境ではメッセージが日本語になったり、引用符の形が変わったりするので、ここではLC_ALL=Cを付けて英語の表示にしています

エラーの例
# ファイル名をaccess.logではなくacces.logと打ち間違えた場合
LC_ALL=C△head△acces.log
実行結果:
head: cannot open ‘acces.log’ for reading: No such file or directory

# 存在するファイルと一緒に指定した場合
LC_ALL=C△head△-n△1△acces.log△users.csv
実行結果:
head: cannot open ‘acces.log’ for reading: No such file or directory
==> users.csv <==
id,name,dept,score
# 存在しないファイルはエラーになりますが、存在するファイルの先頭は表示されます

「invalid number of lines」エラーが出る

-nの後に数字以外を書いたり、数字を書き忘れたりすると、このエラーになります
-n△3△access.logのように、-nの直後に行数を書きましょう

エラーの例
# -nの後に数字を書き忘れた場合
LC_ALL=C△head△-n△access.log
実行結果:
head: invalid number of lines: ‘access.log’
# access.logが行数として読まれてしまい、エラーになります

まとめ

いかがでしたでしょうか
今回はheadコマンドについてまとめてみました
headはファイルや標準入力の先頭部分を表示するコマンドで、オプションなしなら先頭10行、-nで行数、-cでバイト数を指定できます
パイプでls・sort・grepの結果を上位だけに絞ったり、tailと組み合わせて途中の行を取り出したりと、ほかのコマンドと組み合わせるとさらに便利になります
大きなログの確認やCSVのヘッダーの確認など、出番の多いコマンドなので、ぜひマスターしてください!

スポンサーリンク

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!