410gone.click

©2021 sumomo-99

[Linux] tacコマンドの基本的な使い方

更新日: 2021-04-11T08:13:23.026Z

Linux

tacコマンドは引数で指定したファイルや標準入力の内容を、ファイルごとに最後の行から標準出力に出力します。

tac - concatenate and print files in reverse

catコマンドとスペルが逆になっていることから、catコマンドの逆の機能を持っているようなものです。
tacコマンドはGNU Coreutilsに含まれています。
ここでは、tacコマンドの基本的な使い方を紹介します。
 
※以降の実行例は、Ubuntu17.10で確認しています。

目次

 

  • 基本的な使い方
  • 1つのファイルの内容を行単位で逆順にする
  • 復数のファイルの内容を連結する
  • 復数のファイルの内容を連結する(パス展開)
  • 連結した内容を他のファイルに出力する
  • 標準入力とファイルの内容を連結する
  • セパレーターを変更する

 
 

1. 基本的な使い方

tac [option]... [file]...

ファイルの指定がない場合は、標準入力から読み込みを行います。
デフォルトの設定では、ファイルごとに最後の行から順に出力します。

2. 1つのファイルの内容を行単位で逆順にする

ファイルを1つだけ指定した場合、そのファイルの内容を行単位で逆順に表示します。

$ cat file1.txt
abc
def
$ tac file1.txt
def
abc

最終行から出力されました。

3. 復数のファイルの内容を連結する

復数のファイルを指定することで、ファイルの内容を連結して出力します。
結合するファイルの全体ではなく、ファイル単位に逆順になることに注意してください。

$ cat file1.txt
abc
def
$ cat file2.txt
ghi

jkl


mno
$ tac file1.txt file2.txt
def
abc
mno


jkl

ghi

4. 復数のファイルの内容を連結する(パス展開)

bashのパス展開機能を使えば、このような書き方もできます。

$ tac *
def
abc
mno


jkl

ghi

5. 連結した内容を他のファイルに出力する

tacコマンドで連結した内容を他のファイルに出力するには、リダイレクト(>)を利用します。

$ tac file1.txt file2.txt > file3.txt
$ cat file3.txt
def
abc
mno


jkl

ghi

6. 標準入力とファイルの内容を連結する

$ echo 'こんにちは' | tac - file1.txt
こんにちは
def
abc

echoコマンドの出力をパイプ'|'でtacコマンドの標準入力へ渡します。tacコマンドの'-'が標準入力を表しています。

7. セパレーターを変更する

デフォルトの設定では改行までを1つの行とみなします。セパレーターを変更することで、1行として切り出す範囲を変更することができます。
セパレーターの変更には'-s'オプションを指定します。

$ cat file1.txt
abc
def
$ tac -s b file1.txt
c
def
ab

元のデータを制御記号も含めて表現すると、以下のようになります。
abc\ndef\n
セパレーターを'b'にすると、'ab'と'c\ndef\n'の2レコードに分割されます。これを最後のレコードから表示するので、'c\ndef\nab'と出力されます。
ターミナル上では'\n'が改行となるので、以下のように表示されます。

c
def
ab

以上、tacコマンドの使い方の紹介でした。