headを理解する

headは入力の先頭を取り出します。行数とバイト数、ファイルと標準入力、複数ファイルの見出しを区別すると、大きなデータの冒頭だけを確認できます。例はGNU Coreutilsを使うBashで実行します。

この単元で学ぶこと

  • 先頭の行数・バイト数を指定する
  • 標準入力とファイル引数を区別する
  • 複数ファイルとGNUの除外指定を読む

本文解説

先頭だけを読む headは指定がなければ先頭10行を標準出力へ表示します。head -n 3 notes.txtは最初の3行です。入力が2行なら2行だけを表示し、足りない行を作りません。元のファイルを削ったり書き換えたりせず、指定した部分を読み出します。ログの冒頭やCSVの見出しを確認する用途に向きます。

標準入力から受け取る printf "A\nB\nC\n" | head -n 2はAとBの2行を表示します。ファイル名を渡していないため、headはパイプから標準入力を読みます。head -n 2 < notes.txtもファイルを標準入力へ接続する形です。head -n 2 notes.txtとデータは同じでも、ファイルを開く役割は前者がシェル、後者がheadです。

行は改行で区切る 空行も1行として数えます。A、空行、Bの入力をhead -n 2へ渡すと、Aと空行です。改行のない短い末尾断片も表示対象になります。文字数が同じでも改行の位置で行数指定の結果は変わります。改行コードはこの教材ではLFに揃え、環境差のあるCRLFデータと混同しません。

バイト数で取り出す printf "ABCDEF" | head -c 3はABCです。-cは文字数でなくバイト数なので、UTF-8の日本語の途中で切ると不完全な文字になる場合があります。ASCIIの例では一文字一バイトですが、それを一般の文字列へ広げません。-n 3なら3行、-c 3なら3バイトという単位の違いが重要です。

ゼロと大きな指定 head -n 0は何も出力しません。head -n 20に3行だけを渡せば3行全部です。GNU headで-n -2と書くと末尾2行を除く部分を出します。5行なら先頭3行になり、通常の「先頭2行」とは違います。この負数の指定はGNUの動作として扱い、他実装への可搬性が必要なら仕様を確認します。

複数ファイルの区切り head -n 1 a.txt b.txtでは各ファイルの先頭1行を出し、通常はファイル名の見出しが付きます。-qで見出しを抑え、-vで単一ファイルにも見出しを付けられます。後段でデータだけを処理したいなら、見出しが混じる影響を考えます。複数ファイルを一つに連結してから先頭を取る場合とは対象範囲が違います。

抽出順序を考える printf "3\n1\n2\n" | head -n 2 | sort -nは1、3です。先に全体をsort -nしてからhead -n 2なら1、2。最初の2行を並べ替えるのか、全体で小さい2件を取り出すのかが違います。パイプの左側から、各段が受け取るデータを具体的に書き出して確かめます。

安全な確認手順 専用の作業場所でprintf "A\nB\nC\n" > sample.txtを作り、cat sample.txtとhead -n 2 sample.txtを比べます。再度catして元の3行が残ることも確認します。head sample.txt > sample.txtのように入力と出力を同名へすると、シェルが先に出力先を空にするためデータを失います。保存する場合は別名を使います。

図解

先頭を取る位置で結果が変わる
件数を絞る段階を、求めたい結果から決める。

重要ポイント

  • 既定は先頭10行、-nは行、-cはバイト。
  • ファイル引数がなければ標準入力を読む。
  • 複数ファイルは各ファイルに指定を適用する。
  • パイプの順序で抽出範囲が変わる。

間違えやすい点

  • 空行も行として数える。
  • UTF-8のバイト数と文字数を同一視しない。
  • 入力と同じファイルへ出力リダイレクトしない。

用語解説

標準入力
コマンドが通常の入力データを受け取る経路。
行
LF等の区切りで分けたテキストの単位。この例はLF。
バイト
データ量の単位。ASCII文字は一文字1バイト。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。