tac / rev 入門 - 行や文字を逆順にする

tac / rev 入門 - 行や文字を逆順にする

この記事でわかること

  • tac行の並び順 を逆さま(最後の行が先頭)にできる
  • rev各行の文字 を逆さま(abc → cba)にできる
  • tacrev のどっちを使う?」の 使い分け がはっきり分かる
  • ログを 新しい順 で読む、2 つを 組み合わせる など実用テクが身につく

結論(先に覚える違い)

  • 行の順番 をひっくり返したい → tac("cat" の逆綴り)
  • 1 行の中の文字 をひっくり返したい → rev(reverse の略)
  • 名前も対象も「逆」。混同したら tac=行 / rev=文字 と唱える

前提(対象環境)

  • OS:Ubuntu / 一般的な Linux ディストリ
  • tac は GNU coreutils 同梱、rev は util-linux 同梱。どちらも標準でインストール済み

1. tac とは? 何ができるのか

結論: tac はファイルの行を最後から先頭へ、行単位で逆順に出力するコマンド。名前は cat を逆さに綴ったもの。

リナ: 先輩、cat でファイルを表示すると上から順に出ますよね。逆に 下から 表示したいときってどうするんですか?
ライニー先輩: そんなときは tac だよ。cat を逆から綴った名前で、やることもそのまま「行を逆順に表示」なんだ。
リナ: 名前まで逆さまなんですね。
ライニー先輩: そう。まず普通の cat を見てみよう。
$ cat fruits.txt
apple
banana
cherry
$ tac fruits.txt
cherry
banana
apple
リナ: 行がまるごと下からひっくり返りました!文字はそのままなんですね。
ライニー先輩: そこが大事なポイント。tac が動かすのは 行の並び順 だけ。apple という単語の中身(文字)は触らないんだ。

区切りは行(改行)が基本だけど、-s で区切り文字を変えられる。tac -s ',' file ならカンマ区切りで逆順にできる。

2. なぜ「行の逆順」が役立つのか

結論: ログは古い行が上・新しい行が下に追記されるため、tac で逆順にすると最新のできごとから読める。

リナ: 行を逆にして、何の役に立つんですか?
ライニー先輩: 一番の出番は ログ だね。ログファイルは新しい記録が下にどんどん足されていく。つまり「最新」は一番下にある。
リナ: 最新を見たいのに、毎回ファイルの末尾までスクロールするの面倒です…
ライニー先輩: そこで tac。逆順にすれば 最新の行が先頭 に来る。head と組み合わせれば「直近 5 行を新しい順で」もすぐだよ。
$ tac access.log | head -n 5
192.168.0.9 - GET /login 200
192.168.0.4 - GET /api 500
192.168.0.4 - GET /api 500
192.168.0.7 - GET / 200
192.168.0.2 - GET /about 200

tail は「末尾の行」を 元の順番のまま 表示する。「末尾を新しい順で並べ直したい」なら tac の出番。目的が違うので使い分けよう。

3. rev とは? tac と何が違うのか

結論: rev は各行の中の文字を左右反転する。行の並び順は変えない。tac(行を逆順)とは対象がまったく違う。

リナ: tac は行を逆にする…じゃあ rev は何を逆にするんですか?
ライニー先輩: rev1 行の中の文字 を逆さまにするんだ。reverse(リバース)の略だね。並び順じゃなくて、行の中身をひっくり返す。
リナ: つまり abccba になる?
ライニー先輩: その通り。同じファイルで見比べてみよう。
$ rev fruits.txt
elppa
ananab
yrrehc

tac と rev の違い(ここが核心)

コマンド 逆にする対象 apple → 行の順番
tac 行の並び順 apple 変わる
rev 各行の中の文字 elppa 変わらない
リナ: 名前も「逆」だけど、逆にする中身も違うんですね。tac は行、rev は文字、っと。
ライニー先輩: それを覚えれば完璧。ちなみに rev はパッケージも別で、coreutils じゃなく util-linux に入っている。どちらも最初から使えるけどね。

4. tac と rev を組み合わせると?

結論: tac file | rev で「行の順番」も「各行の文字」も両方逆になる。パイプでつなぐだけ。

リナ: 行も文字も、両方ひっくり返したいときは?
ライニー先輩: パイプでつなげばいいよ。tac の出力を rev に流す。
$ tac fruits.txt | rev
yrrehc
ananab
elppa
リナ: cherry が先頭に来て(行が逆)、さらに yrrehc と文字も逆になってます!
ライニー先輩: そう、2 段階で効いてるんだ。rev | tac でも結果は同じ。順番を気にせず組み合わせられるのがパイプの強みだね。

rev は標準入力も読める。echo "Linux" | revxuniL を返す。ファイルがなくてもパイプで気軽に試せる。

5. よくある落とし穴と使い分けまとめ

結論: 行を逆順にするのが tac、行内の文字を逆順にするのが rev。混同が一番の事故。迷ったら小さなファイルで試す。

やりたいこと コマンド
行を下から上へ並べ替える tac file
ログを新しい順で先頭から読む tac log
各行の文字を左右反転する rev file
行も文字も両方逆にする tac file | rev

やってはいけない・間違えやすいこと

  • tacrev を取り違える(行を逆にしたいのに rev を使って文字化けに見える)
  • tailtac を混同する(tail は順番そのまま、tac は逆順)
  • 大きなファイルでいきなり実行せず、まず head 付きや小さな例で確認する