tailを理解する

tailは入力の末尾や指定位置以降を取り出します。最後の数行を見る場合と、先頭から数えた位置まで読み飛ばす場合の違いを、行番号付きの例で確かめます。

この単元で学ぶこと

  • 末尾行数と開始行番号を区別する
  • 行とバイトの指定を使い分ける
  • ログ追跡と静的な抽出を区別する

本文解説

末尾から取り出す tail -n 2 log.txtは最後の2行を表示します。1、2、3、4という4行なら3、4です。指定なしの既定は10行。元ファイルは書き換えません。過去の大量の記録から直近の末尾を読む用途で使いますが、行が必ず時刻順とは限らないため、データの並びも確かめます。

プラス付きの開始位置 tail -n +3は先頭から数えた3行目以降を表示します。1~5の5行なら3、4、5です。tail -n 3は末尾3行なので、この例では偶然同じですが、6行あれば結果は違います。+1なら最初から全体で、+は追加や正数の飾りではなく開始位置指定を表します。

見出しを除く CSVの1行目が見出しならtail -n +2 data.csvで2行目以降を得られます。ただしCSVの引用符内に改行がある場合、物理行とレコードは一致しません。tailはCSV構文を解釈しないため、単純な行抽出の適用範囲を確認します。例では各レコードが一つのLF行に収まるテキストを使います。

末尾のバイトを取る printf "ABCDEF" | tail -c 2はEFです。tail -c +3は先頭から3バイト目以降のCDEFになります。行番号と同様に開始位置は1から数えます。-cはバイトの単位なので、マルチバイト文字の途中を切る可能性があります。-nと-cを、表示したい単位に合わせて選びます。

短い入力と空行 tail -n 10へ2行を渡すと2行全部、-n 0なら何も出しません。A、B、空行という入力の最後1行は空行です。見えないからデータがないとは断定せず、wc -l等でLFの数を確かめます。末尾改行がない断片も行として扱われ、最後の断片を表示できます。

範囲を組み合わせる 1~6の6行にtail -n +2 | head -n 3を適用すると2、3、4です。まず1行目を飛ばし、残りの先頭3行を取ります。一方tail -n 3 | head -n 1は4です。全体の末尾3行4、5、6から先頭を取るためです。各段階の実データを書き、添字をJavaと同じ0始まりにしません。

増えるログを追う tail -fは通常、開いたファイル記述子を追って追記を表示し続けます。GNUのtail -Fは名前を追う指定と再試行を組み合わせ、ローテーションで同名の新しいファイルへ置換される場面を扱います。ただし反映のタイミングやファイルシステムに依存し、過去の消去済み記録を復活させる機能ではありません。停止は通常Ctrl+Cです。

検証を二段階に分ける まず専用ディレクトリにprintf "1\n2\n3\n4\n" > sample.txtを作り、tail -n 2とtail -n +2を比較します。追跡を試す場合は別端末でprintf "5\n" >> sample.txtと追記し、表示を確認して終了します。さらに実Linuxで名前変更・新規作成時の-f/-F差を検証します。監視を終えるときはCtrl+Cを押します。名前変更や新規作成を試す対象は、自分で用意した練習用ファイルに限定します。

図解

末尾の個数と先頭からの開始位置
同じ3でも、+の有無で基準が変わる。

重要ポイント

  • -n Nは末尾N行、-n +NはN行目以降。
  • 開始位置指定は1から数える。
  • -cは文字でなくバイト。
  • -fと-Fでは追跡対象の扱いが異なる。

間違えやすい点

  • 末尾3行と3行目以降は異なる。
  • 空行と出力ゼロを見た目だけで混同しない。
  • ログ追跡は削除済みデータの復旧ではない。

用語解説

追記
ファイル末尾へデータを追加すること。
ローテーション
ログファイルを切り替え、古い記録と新しい記録を分ける運用。
ファイル記述子
開いたファイル等をプロセスが参照する識別子。

関連教材

参考資料

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

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