tac / rev 入門 - 行や文字を逆順にする
この記事でできるようになること
- `tac` で行の並び順を逆さまにできる
- `rev` で各行の中の文字を逆さまにできる
- `tac` と `rev` と `tail` を取りちがえずに使い分けられる
前提知識(先に読むと理解しやすい記事)
この記事でわかること
tacで 行の並び順 を逆さま(最後の行が先頭)にできるrevで 各行の文字 を逆さま(abc → cba)にできる- 「
tacとrevのどっちを使う?」の 使い分け がはっきり分かる - ログを 新しい順 で読む、2 つを 組み合わせる など実用テクが身につきます
言葉の整理(先に取りちがえを防ぎます)
- 行:ファイルの中の 1 行のことです。改行から改行までのひとかたまりを指します。
- 行の並び順:どの行が何番目に来るか、という順番です。
tacが変えるのはここだけです。 - 行の中の文字:1 行を組み立てている文字そのものです。
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 を使えば区切り文字を変えられます。
ただし区切り文字の付き方が直感とちがうため、初心者のうちは無理に使わなくて構いません。くわしくは man tac を読んでください。
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 | 変わらない |
rev は入っているパッケージも別なんだ。tac は coreutils、rev は util-linux に入っている。どちらも最初から使えるけどね。4. tac と rev を組み合わせると?
結論:
tac file | revで「行の順番」も「各行の文字」も両方逆になる。パイプでつなぐだけ。
tac の出力をそのまま rev に流すんだ。$ tac fruits.txt | rev
yrrehc ananab elppa
tac が行を逆にして、そのあと rev が文字を逆にした。rev | tac と順番を入れかえても結果は同じだよ。2 つは別々の場所を書きかえるからね。rev は標準入力も読めます。echo "Linux" | rev を実行すると xuniL が返ります。ファイルを用意しなくても、パイプで気軽に試せます。
5. リナの失敗:tac のつもりで rev を使う
結論: 行を逆にしたいのに
revを使うと、文字化けのように見える。原因は文字が反転しているだけ。
練習用に小さなログを作ります。
$ cat << 'EOF' > mini.log 2026-06-01 start 2026-06-02 error 2026-06-03 done EOF
$ rev mini.log
trats 10-60-6202 rorre 20-60-6202 enod 30-60-6202
rev を使ったから、1 行の中の文字が左右反転している だけなんだ。2026-06-01 が 10-60-6202 になっている。右から読めば、もとの内容が読めるはずだよ。tac を使う。こうすれば新しい順になるよ。$ tac mini.log
2026-06-03 done 2026-06-02 error 2026-06-01 start
tac と rev の取りちがえには気をつけます。どちらのコマンドも 元のファイルは変えません。画面に結果を出すだけです。だから取りちがえてもファイルは壊れません。
なお tac と rev は、本サイトの仮想ターミナル入力したコマンドを解釈してコンピュータに実行させる対話プログラム。にはまだありません。この記事の例は、手元の Linux やターミナルで試してください。
6. よくある落とし穴と使い分けまとめ
結論: 行を逆順にするのが
tac、行内の文字を逆順にするのがrev。混同が一番の事故。迷ったら小さなファイルで試す。
| やりたいこと | コマンド |
|---|---|
| 行を下から上へ並べ替える | tac file |
| ログを新しい順で先頭から読む | tac log |
| 各行の文字を左右反転する | rev file |
| 行も文字も両方逆にする | tac file | rev |
やってはいけない・間違えやすいこと
tacとrevを取りちがえます。行を逆にしたいのにrevを使うと、文字化けのように見えますtailとtacを混同します。tailは順番そのまま、tacは逆順です- 大きなファイルでいきなり実行しません。まず
headを付けるか、小さな例で確かめます
7. ミニ課題:実際にやってみよう
結論: 行の逆順・文字の逆順・両方の組み合わせの 3 問で、
tacとrevの対象のちがいを手で確かめる。
$ cat << 'EOF' > animals.txt penguin tiger whale EOF
課題 1:animals.txt の行を、下から順に表示しよう。
ヒント 1(方向づけ)を見る
変えたいのは行の並び順です。行の中の文字はそのままにします。
ヒント 2(コマンド名)を見る
使うのは tac です。オプションは要りません。
答えを見る
$ tac animals.txt
whale tiger penguin
行の順番だけが変わりました。単語のつづりはそのままです。
課題 2:animals.txt の各行の文字を、左右反転して表示しよう。
ヒント 1(方向づけ)を見る
今度は行の並び順を変えません。1 行の中の文字だけを逆にします。
ヒント 2(コマンド名)を見る
使うのは rev です。
答えを見る
$ rev animals.txt
niugnep regit elahw
行の順番は変わりません。文字だけが逆になりました。
課題 3:行の順番も、行の中の文字も、両方逆にして表示しよう。
ヒント 1(方向づけ)を見る
2 つの作業を続けて行います。1 つ目の結果を、そのまま 2 つ目に渡します。
ヒント 2(コマンド名)を見る
使うのは tac と rev の 2 つです。つなぐ記号は | です。
答えを見る
$ tac animals.txt | rev
elahw regit niugnep
rev animals.txt | tac と書いても同じ結果になります。
8. 振り返り
tac が変えるのは行の並び順で、rev が変えるのは行の中の文字ですね。tac。tail は順番そのままでしたね。今日の 3 行まとめ
tacは行の並び順を逆にする。行の中の文字は変えないrevは行の中の文字を逆にする。行の並び順は変えない- ログを新しい順で読むなら
tac。tailは末尾を元の順番のまま出す