tac / rev 入門 - 行や文字を逆順にする
この記事でわかること
tacで 行の並び順 を逆さま(最後の行が先頭)にできるrevで 各行の文字 を逆さま(abc → cba)にできる- 「
tacとrevのどっちを使う?」の 使い分け がはっきり分かる - ログを 新しい順 で読む、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 は何を逆にするんですか?ライニー先輩:
rev は 1 行の中の文字 を逆さまにするんだ。reverse(リバース)の略だね。並び順じゃなくて、行の中身をひっくり返す。リナ: つまり
abc が cba になる?ライニー先輩: その通り。同じファイルで見比べてみよう。
$ 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" | rev は xuniL を返す。ファイルがなくてもパイプで気軽に試せる。