Linux / コマンド / tac - ファイルを最後の行から逆順に出力

tacは、ファイルのレコード(区切りごとのデータ)を最後から最初の順に出力します。基本のレコード区切り文字は改行なので、ログの最新の項目を先に確認したり、行の順序を逆にする場合に使用できます。

この記事ではtacの基本的な文法と主なオプション、実際の使用例、関連コマンドとの違い、使用時の注意点について説明します。

catの名前を逆にしたコマンドで、ファイルのバイト自体ではなく、区切り文字で分けられたレコードの順序を逆にします。複数のファイルを指定すると、それぞれのファイルは順番に処理されますが、各ファイル内のレコードは逆順で出力されます。

基本的な文法

tac [オプション] [ファイル ...]

オプションや詳細な動作は実装やバージョンによって異なる場合があります。現在のシステムではtac --helpとman tacでインストールされたコマンドの説明を確認してください。

tac の基本的な使い方

行の順序を逆にする

最後の行が最初に出力されます。

tac events.log

複数ファイルの処理

各ファイル内部は逆順になり、ファイル引数の順序は保持されます。

tac january.log february.log

標準入力を逆順で出力する

パイプ入力も処理できますが、最初のレコードを決定するには全体の入力を受け取る必要があります。

printf 'one\ntwo\nthree\n' | tac

行の順序が逆になる結果

tacは文字ではなく、行の順序を逆に出力します。各行内の文字の順序はそのままです。

printf 'first\nsecond\nthird\n' | tac

例の出力:

third
second
first

時間順に積み重なるログを最新の行から読むときに便利ですが、タイムスタンプ順のソートのような作業ではありません。

既定では区切り文字は直前のレコードの末尾に属します。最終行に改行がないファイルでは、その行が最初に出力されても自動で改行が追加されないため、次の行の内容とつながることがあります。例えば printf 'a\nb' | tac は b と a が同じ行になり、末尾に改行が付きます。

主なオプション

オプション 説明
-s STRING 改行の代わりに使用するレコード区切り文字を指定します。
-b 区切り文字を次のレコードの先頭に付けたものとして扱います。
-r 区切り文字列を正規表現として解釈します。
--help 現在インストールされている実装のヘルプを表示します。

実践的活用例

最近のログから確認する

単純なテキストログであれば、最後の記録から見ることができます。継続的に追加されるログにはtail -fによる追跡が適しています。

tac application.log | less

区切り文字が異なるレコードの反転

GNU tacの-sでユーザー定義の区切り文字を指定します。

tac -s '---' records.txt

条件に合う最近の項目を探す

逆順で出力した後、最初の一致で停止すると、全体の結果を画面に流さずに最近の項目を探すことができます。例の access.log は自分のテキストログに置き換えます。検索条件の指定はgrepコマンドの使い方も参考になります。

tac access.log | grep -m 1 'ERROR'

tacと関連するコマンドの比較

コマンド 主な役割 適した状況
tac レコード順序を逆にする 最後の行から読む
cat 元の順序で出力 出力とファイルを結合
tail 最後の部分を一部出力 最近の数行だけ確認
sort -r 値を基準に逆順に並べる 内容を基準に並べる

使用する際の注意点

並べ替えコマンドではありません

内容のサイズや時間値を解釈せず、現在のレコード順序のみを逆にします。

大きなストリームは遅延することがあります

入力の終わりを知る必要があるため、終わらないストリームには適していません。GNU版はパイプなどシークできない入力を一時ファイルへ保存する場合があり、TMPDIR や既定の一時領域の空き容量と、保存するデータの扱いにも注意します。

区切り文字オプションの移植性を確認する

-sと正規表現の動作はGNUの実装基準ですので、対象システムのマニュアルを確認してください。

FAQ

tacとsort -rは同じですか?

いいえ。tacは現在の行の順序を逆にし、sort -rは各行の値を比較して逆順に並べ替えます。

最後の10行だけを逆順に見たい場合はどうすればいいですか?

tail -n 10 ファイル | tacのように組み合わせることができます。

リアルタイムログを逆順で見ることはできますか?

終わらない入力は逆順処理が困難です。リアルタイム監視にはtail -fを使用してください。

複数のファイルを1つに混ぜて逆順処理しますか?

一般的には各ファイルを引数順に読み、ファイルごとのレコードを逆順に出力します。

参考資料