También conocido como gato inverso, tac es una utilidad de línea de comandos simple que le permite invertir las líneas en la salida usando el | operador de tubería incorporado y tac. Es decir, si tiene un comando, en el lado izquierdo (lhs) y desea invertir el contenido de su salida, todo lo que debe hacer es escribir lhs | tac. Eso es!
Es cierto que hay más en tac de lo que parece. No te preocupes. Lo cubriremos todo a su debido tiempo.
Consejos sobre tac
Usar o no usar, esa es la cuestión. No lo harás, no querrás hacer tac cuando no tengas que hacerlo. Sin embargo, si desea extender el tac como su comando de pan y mantequilla, eso depende de usted. Mientras tanto, aquí está mi consejo sobre el tac tomar ambos lados para permanecer neutrales.
Cuando usar tac
Hay ocasiones en las que usar tac que le ayuda a sacar más provecho de la línea de comando con menos código y menos tiempo dedicado a investigar las opciones de comando de lhs.
Cuando no está seguro de las opciones de lhs
Muchos comandos como sort vienen con una opción para revertir la salida de un comando. Sin embargo, si no está seguro de si un comando en el lado izquierdo tiene o no una opción -r para invertir la salida, usar tac es una forma segura de invertir las líneas de salida.
Cuando el rendimiento no importa
Aunque insignificante, la mayoría de los comandos utilizados junto con una opción incorporada para revertir la salida funcionan mejor que conectar la salida a tac. Entonces, si un pequeño retraso en el rendimiento no es un problema, conectar en tac para reproducir la salida en reversa está bien.
Cuando no usar tac
Hay momentos en los que no puede usar tac porque sabe mejor. Aquí hay algunos para tener en cuenta.
Cuando sepa que el comando en el lhs tiene una opción para invertir las líneas de salida
Como dije, "La mayoría de los comandos vienen con una opción para invertir la salida."Si sabe que un comando lhs específico tiene una opción, no puede usar tac. Después de todo, -r es más corto que - | tac.
Cuando el rendimiento importa
Como dije, "Usar la opción inversa de lhs puede funcionar mejor que tac."Si está buscando exprimir unos segundos en un script bash o está tratando con archivos más grandes que requieren tiempo para leerse, no puede usar tac.
Tac ayuda
Ejecutar el comando de ayuda para tac o man tac muestra el uso junto con las opciones que pueden usarse. Esto es lo que puede esperar.
Comandos
tac --ayudaProducción
Versión tac
¿Qué versión soy yo??
Eres la última versión de ti mismo. Sin embargo, en el caso de la versión de su tac, hay una opción para eso.
Comandos
tac --versiónProducción
Notas
Si está utilizando tac en FreeBSD o macOS, es posible que la opción larga para la versión no esté disponible. En ese caso, intente -v o man tac. Si lo has probado, avísame. Tengo curiosidad. Gracias
Opciones de tac
Además de la ayuda y la versión, tac no tiene muchas opciones. Por lo que tiene, seguro que descubrirás que tac no es un gato al revés cualquiera.
Tac antes de la opción
La opción -b le permite cambiar cómo se adjunta el separador en la salida. De forma predeterminada, el separador de nueva línea se adjunta después de cada línea.
Se que es confuso. Vamos a desglosarlo con el ejemplo.
Primero, veamos cómo se ve nuestra salida antes de usar tac -b.
Comandos
seq 10Producción
Ahora veamos en qué se convierte nuestra salida después de usar tac sin -b.
Comandos
seq 10 | tacProducción
Ahora veamos en qué se convierte la salida usando tac -b.
Comandos
seq 10 | tac -bProducción
Opción de separador Tac
La opción de separador -s 'cadena literal' le permite especificar el carácter o la secuencia de caracteres utilizados por tac para distinguir las líneas. De forma predeterminada, se utiliza el carácter de nueva línea ('0a' en hexadecimal).
Cómo usar la opción de separador tac no es obvio al principio. Sin embargo, una vez que sepa que está ahí, es difícil no intentar usarlo.
Considere el siguiente ejemplo, operando en líneas representadas en hexadecimal.
Comandos
seq 20 | xxd -ps | tac -s '0a' | xxd -ps -rProducción
Notas
(1) Puede parecer trivial usar la secuencia 20 | comando tac, sin embargo, en ese caso, no pasamos tiempo trabajando en el flujo de salida en hexadecimal. El uso de este patrón es útil cuando la separación no es algo trivial como el carácter de nueva línea, como el byte cero.
Ahora menos, intente usar tac en algo un poco menos crudo y más meta como HTML simple.
Considere el siguiente archivo.
Archivo
AB
C
Comandos
file () echo -e "AB
C
";
archivo | tac -s "
"
Producción
Logramos convertir la página HTML
AB
C
dentro
CB
A
usando tac.
Suponga que necesita hacer algo un poco más complicado, como tratar cualquier etiqueta como un separador de tac. En ese caso, no se saldrá con la suya con solo usar la opción de separador solo. Ahí es donde entra la opción de expresiones regulares. Combinado con la opción de separador, le permite hacer más con el comando tac que invertir una línea en un archivo. Así es cómo.
Opción tac regex
La opción de expresiones regulares -r -s 'regex' le permite especificar que la cadena de separación debe tratarse como una expresión regular.
Cómo usar la opción tac regex es tan simple como agregar la opción -r antes o después del separador.
Considere el ejemplo anterior usando la opción regex junto con la opción de separador. Hagamos que tac trate cualquier etiqueta de marcado como un separador.
Archivo
funciones simples
Las funciones son simples en bash. Al menos este es. Pone una cuerda en la pantalla.
Comandos
función simple
()
eco
tan simple como se pone función simple
Fuente: https: // temptemp3.github.io / bash-functions
Comandos
expediente ()eco '
funciones simples
Las funciones son simples en bash. Al menos este es. Pone un
cuerda en la pantalla.
Comandos
función simple
()
eco tan simple como se pone
función simple
archivo | tac -r -s "] *."
Producción
Logramos convertir la página HTML invirtiendo el archivo usando etiquetas HTML. Si observa los detalles, notará que aún no es perfecto.
Comando tac en puro bash
Aquí hay una versión primitiva de tac implement en bash puro que invierte las líneas canalizadas por un comando lhs. Las versiones futuras se dejan como ejercicio.
#!/ bin / bash## tac
## versión 0.0.1 - inicial
##########################################################################################################################################################################################################################################################################################
tac ()
local -a arr
local -i i
mapfile arr -
i = "$ # arr [@]"
mientras que [$ i -ge 0]
hacer
echo $ arr [i]
sea i- = 1
hecho
###############################################
tac
##########################################################################################################################################################################################################################################################################################
Fuente: https: // github.com / temptemp3 / ba.sh / blob / master / tac.sh
Comando Tac usando otros comandos
Aquí hay algunas versiones primitivas de tac implement que usan otros comandos que invierten las líneas ingresadas por un comando lhs. Las versiones futuras se dejan como ejercicio.
Antes de comenzar, cierre los ojos y piense: "¿Qué podría usarse para implementar una versión primitiva de tac?"
Me vienen a la mente muchos comandos, pero me centraré en aquellos para los que tenemos espacio.
papar moscas
Similar al comando Tac en el ejemplo puro de bash, para implementar tac, primero almacenaríamos las líneas leídas para que se reproduzcan al revés después de que se lean todas las líneas. Así es como se vería usando gawk.
gawk 'línea [++ línea [0]] = $ (0) END para (i = 0; i
Ahora intente usar el comando lhs seq 10.
seq 10 | gawk 'línea [++ línea [0]] = $ (0) END para (i = 0; i
Como era de esperar, la salida es
Ejercicios
1. La función lhs () seq 10; enumera los números enteros del 1 al 10. Escriba un comando rhs tal que lhs | rhs es igual a 10864213579 solo usando tac (Sugerencia: vea Tac antes del ejemplo de opción)
2. Invierta la salida de rhs () find -mindepth 1 -maxdepth 1 -print0; usando tac (Sugerencia: consulte el ejemplo de la opción de separador de Tac)
3. Extender tac.sh (en el comando Tac en bash puro) para comportarse exactamente como tac. Deberá agregar opciones y asegurarse de probar su comportamiento.
4. Implementar una versión primitiva de tac en bash puro como función recursiva.
TL; DR
Nuevamente, disfruté escribiendo el comando Bash tac. Después de leer espero que estés de acuerdo en que hay más en tac de lo que pensabas. Además, después de intentar hacer las cosas de la manera más difícil cerca del final, espero que sepas lo útil que podría ser el comando tac. Si alguien logra completar alguno de los ejercicios o necesita ayuda con su tarea, hágamelo saber. Gracias,