83

I like to use tac to reverse the output of cat. However, it's not available in the Mavericks terminal. I tried to find it on MacPorts and again it's not available. Can anyone please show me how to get tac? It's very helpful for reading log files.

Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
polarise
  • 1,021
  • 1
  • 7
  • 9

4 Answers4

99

On OS/X like on many systems (BSDs, Solaris, AIX, IRIX...), the functionality of GNU tac is available in tail with the -r option. So no need to install GNU tac:

tail -r the-file
Stéphane Chazelas
  • 522,931
  • 91
  • 1,010
  • 1,501
  • 15
    So, `alias tac='tail -r'` will do the trick for OP! – Ketan Maheshwari Feb 07 '14 at 17:18
  • 12
    [Well, actually](http://tirania.org/blog/archive/2011/Feb-17.html) using a shell alias may fail because aliases don't transfer into shell scripts. Use a function like `tac() { tail -r -- "$@"; }` – kojiro Mar 01 '16 at 17:44
  • Does it have options like `-rs` which will let you reverse at char level instead of new lines? – C-- Nov 07 '19 at 20:00
  • @SubinSebastian, I've updated the link to the man page which Apple no longer makes available. But in short, no BSD `tail` has no equivalent of GNU `tac`'s `-s` option. – Stéphane Chazelas Nov 07 '19 at 21:45
88

Yes:

  • Install Homebrew
  • brew install coreutils
  • ln -s /usr/local/bin/gtac /usr/local/bin/tac apparently not needed with latest Homebrew, see comment by Ran Ever-Hadani below

or use MacPorts to install coreutils in a similar way.

grebneke
  • 4,621
  • 25
  • 20
  • 2
    Addition to [grebneke](https://unix.stackexchange.com/users/32165/grebneke)'s answer: no need the soft link anymore. The g suffix is now only added if osx already has a command with that name, so tac is installed as tac, not gtac. – Ran Ever-Hadani Feb 17 '19 at 21:34
1

One temporary solution could be:

alias tac='perl -e "print reverse(<>)"'
JJoao
  • 11,887
  • 1
  • 22
  • 44
  • 1
    This just caused me to learn that `<>` doesn't only read from STDIN, but optionally from `@ARGV`. https://stackoverflow.com/questions/29020883/less-than-and-greater-than-symbols-together I still don't know if `reverse` will load the whole file into memory before outputting the lines in reverse order. That would be terrible. – Bruno Bronosky Apr 09 '19 at 18:11
  • 1
    @BrunoBronosky, > ...STDIN, but optionally from @ ARGV : yes that is what <> is for. > ... will load the whole file into memory... : YES, IT WILL! (avoid doing this with gigabyte files) – JJoao Apr 10 '19 at 07:45
0

Install gnu coreutils already compiled with Rudix:

sudo rudix install coreutils

Or download and gui install Rudix coreutils