¿Cómo puedo obtener el comando tac en OS X?

59

Me gusta usar tacpara invertir la salida de cat. Sin embargo, no está disponible en el terminal Mavericks. Traté de encontrarlo en MacPorts y nuevamente no está disponible. ¿Alguien puede mostrarme cómo llegar tac? Es muy útil para leer archivos de registro.

polarizar
fuente

Respuestas:

66

Si:

  • Instalar Homebrew
  • brew install coreutils
  • ln -s /usr/local/bin/gtac /usr/local/bin/tac aparentemente no es necesario con el último Homebrew, vea el comentario de Ran Ever-Hadani a continuación

o use MacPorts para instalar coreutilsde manera similar.

grebneke
fuente
No entiendo cómo lo ln -s /usr/local/bin/gtac /usr/local/bin/tachizo funcionar ... ¿No se supone que ese comando solo enumera algunos bloques de memoria de archivos?
Timothy Swan
1
El enlace simbólico es solo por conveniencia. Homebrew instala los binarios coreutil en / usr / local / bin con el prefijo de su nombre original con una 'g'. lsse convierte gls, headse convierte , gheadetc. En consecuencia, tacse instala como gtac, y el enlace simbólico sugerido en esta respuesta es solo ponerlo a tacdisposición con ese nombre. Omitiendo el enlace simbólico, aún puede ejecutar el programa como gtac.
grebneke
Oh. Estás hablando de ln -sno. ls -sEsto tiene más sentido ahora. Debo haberlo ingresado correctamente la primera vez.
Timothy Swan
2
Además de la respuesta de grebneke : ya no necesita el enlace suave. El sufijo g ahora solo se agrega si osx ya tiene un comando con ese nombre, por lo que tac se instala como tac, no como gtac.
Ran Ever-Hadani
70

En OS / X, como en muchos sistemas (BSD, Solaris, AIX, IRIX ...), la funcionalidad de GNU tacestá disponible tailcon la -r opción . Entonces no es necesario instalar GNU tac:

tail -r the-file
Stéphane Chazelas
fuente
11
Por lo tanto, alias tac='tail -r'hará el truco para OP!
mkc
8
Bueno, en realidad el uso de un alias de shell puede fallar porque los alias no se transfieren a los scripts de shell. Utilice una función comotac() { tail -r -- "$@"; }
kojiro
0

Una solución temporal podría ser:

alias tac='perl -e "print reverse(<>)"'
JJoao
fuente
1
Esto solo me hizo aprender que <>no solo lee de STDIN, sino opcionalmente de @ARGV. stackoverflow.com/questions/29020883/… Todavía no sé si reversecargará todo el archivo en la memoria antes de enviar las líneas en orden inverso. Eso sería terrible
Bruno Bronosky
@BrunoBronosky,> ... STDIN, pero opcionalmente de @ ARGV: sí, para eso está <>. > ... cargará todo el archivo en la memoria ...: ¡SÍ, LO HARÁ! (evite hacer esto con archivos gigabyte)
JJoao