tac: Es un comando de GNU Core Utilities (coreutils) que permite copiar el contenido de uno varios archivos en orden inverso y mostrarlo en el «Standard Output»
Ya es lunes de nuevo y lo prometido es deuda :D, otra publicación más sobre GNU Core Utilities, en el artículo anterior hablamos sobre cat, puedes volver a visitarlo aquí: Coreutils cat: Output de archivos completos (parte 1), si no lo leiste corre a leerlo, te espero…. ¿ya?… ¡genial!.
Bien, esta ocasión hablaremos sobre el mellizo malvado de cat… tac !!! bueno quizás no sean tan mellizos ni tan malvados :P.
Ya fuera de bromas y referencias a friends :P
¿Qué es tac?
tac, al igual que cat copia el contenido de un archivo y lo despliega en el “Standard Output”, sin embargo lo hace de forma inversa.
Wait… What?… Si, tac por default comienza a mostrar primero la última línea y al final la primera línea. Para los ejemplo utilizaremos el siguiente archivo: ejemplo-104
Bien.. primero revisemos qué contiene el archivo, ¿cómo? vamos a usar el comando cat!!! :D.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
gabriel@gultij:~/Gultij/Coreutils/files$ cat ejemplo-104.txt Esto es un archivo normal... común y corriente... no pasa nada nada por aquí, ni nada por allá hasta que ... wingardium leviosa wait.. what? vamos a ver que pasa despues de ese momento extraño creo que ya es suficiente |
Ahora veamos el mismo archivo utilizando tac
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
gabriel@gultij:~/Gultij/Coreutils/files$ tac ejemplo-104.txt creo que ya es suficiente vamos a ver que pasa despues de ese momento extraño wait.. what? wingardium leviosa hasta que ... no pasa nada nada por aquí, ni nada por allá común y corriente... Esto es un archivo normal... |
:o Está al revés !!!! Eso es… poco útil :(. Claro, podría parecer que tac es un comando inútil, pero hay ciertos escenarios en los que quisieras leer un archivo comenzando por la última línea, por ejemplo un log de errores y quieres comenzar por el error más reciente. ;)
¿No tiene opciones el comando?
Si, claro que tiene opciones, y como es usual pueden consultarlas con la opción «–help».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
gabriel@gultij:~/Gultij/Coreutils/files$ tac --help Usage: tac [OPTION]... [FILE]... Write each FILE to standard output, last line first. With no FILE, or when FILE is -, read standard input. Mandatory arguments to long options are mandatory for short options too. -b, --before attach the separator before instead of after -r, --regex interpret the separator as a regular expression -s, --separator=STRING use STRING as the separator instead of newline --help display this help and exit --version output version information and exit GNU coreutils online help: <http://www.gnu.org/software/coreutils/> Full documentation at: <http://www.gnu.org/software/coreutils/tac> or available locally via: info '(coreutils) tac invocation' |
Honestamente me es un poco complicado encontrar ejemplo útiles para las opciones del comando tac, así que utilizaré ejemplo inútiles y dejaré que ustedes le encuentren utilidad xD.
Opción -s ó –separator
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
gabriel@gultij:~/Gultij/Coreutils/files$ tac -s "wingardium leviosa" ejemplo-104.txt. wait.. what? vamos a ver que pasa despues de ese momento extraño creo que ya es suficiente Esto es un archivo normal... común y corriente... no pasa nada nada por aquí, ni nada por allá hasta que ... wingardium leviosa |
OMG !!! no sé para qué sirve eso en el mundo real, pero después de definir una cadena «wingardium leviosa» se convirtió en el separador, esto quiere decir que en lugar de invertir todas las líneas, el archivo comienza a invertirse desde el momento en que encuentra el separador y podemos ver que el separador es procesado hasta el final.
Opción -b ó –before
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
gabriel@gultij:~/Gultij/Coreutils/files$ tac -b -s "wingardium leviosa" ejemplo-104.txt wingardium leviosa wait.. what? vamos a ver que pasa despues de ese momento extraño creo que ya es suficiente Esto es un archivo normal... común y corriente... no pasa nada nada por aquí, ni nada por allá hasta que ... |
Si usamos la opción «-b» el separador es procesado antes y en lugar de mostrarlo al final, lo muestra al principio.
Opción -r ó –regex
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
gabriel@gultij:~/Gultij/Coreutils/files$ tac -b -r -s "^win" ejemplo-104.txt wingardium leviosa wait.. what? vamos a ver que pasa despues de ese momento extraño creo que ya es suficiente Esto es un archivo normal... común y corriente... no pasa nada nada por aquí, ni nada por allá hasta que ... |
Finalmente la opción «-r» nos permite utilizar una expresión regular como separador en lugar de una cadena regular.
Concurso
Debo admitir que estos son los ejemplo más ridículos que pude haber imaginado, pero estoy seguro que ustedes podrán encontrar cosas mucho más ingeniosas, de hecho, a la persona que nos diga en la sección de comentarios el ejemplo más ingenioso de tac utilizando TODAS SUS OPCIONES le vamos a obsequiar una playera del Gultij.
Ya mandamos pedir las playeras con el siguiente «diseño»
Nombraremos al ganador durante la próxima publicación de la serie, todos pueden participar.
Eso es todo por hoy, espero que les sea de mucha utilidad estas publicaciones, no dejen de comentar si les gusto y como siempre, háganos saber en qué podemos mejorar.
Hasta la próxima :D.