Filtros en Linux – Convirtiendo datos en información

Introducción

Uno de los principios subyacentes de Linux es que cada elemento debe hacer una cosa y solo una cosa, y que podemos unirlos fácilmente. Piensa en ello como un conjunto de bloques de construcción que podemos armar, sin embargo, nos gusta construir lo que queramos.

En este artículo y en el siguiente, aprenderemos sobre algunos de estos componentes básicos. Luego, en los siguientes artículos, veremos cómo podemos construirlos en creaciones más complejas que puedan hacer un trabajo útil para nosotros.

Esta página es bastante larga, pero en su mayoría son ejemplos, por lo que no da tanto miedo como parece.

¿Qué son?

Un filtro, en el contexto de la línea de comandos de Linux, es un programa que acepta datos textuales y luego los transforma de una manera particular. Los filtros son una forma de tomar datos sin procesar, ya sea producidos por otro programa o almacenados en un archivo, y manipularlos para que se muestren de una manera más adecuada a lo que buscamos.

Estos filtros a menudo tienen varias opciones de línea de comandos que modificarán su comportamiento, por lo que siempre es bueno consultar la página del manual de un filtro para ver qué hay disponible.

En los ejemplos a continuación, proporcionaremos información a estos programas mediante un archivo, pero en el artículo sobre pipes y redireccionamiento veremos que podemos proporcionar información a través de otros medios que agreguen mucha más potencia.

Vamos a sumergirnos y presentarte algunos de ellos. (recuerda, los ejemplos aquí solo te darán una idea de lo que es posible con estos comandos. Asegúrate de explorar y usar tu creatividad para ver qué más puedes hacer con ellos).

No voy a entrar en demasiados detalles sobre estos. Creo que son bastante explicativos en su mayor parte.

Para cada una de las demostraciones a continuación, utilizaré el siguiente archivo como ejemplo. Este archivo de ejemplo contiene una lista de contenido con el único fin de hacer que los ejemplos sean un poco más fáciles de entender, pero ten en cuenta que funcionarán igual con cualquier otro dato textual.

Además, recuerda que el archivo se especifica realmente como una ruta y, por lo tanto, puedes usar rutas absolutas y relativas y también comodines.

head

Head es un programa que imprime las primeras tantas líneas de su entrada. Por defecto imprimirá las primeras 10 líneas, pero podemos modificar esto con un argumento de línea de comandos.

head [-número de líneas para imprimir] [ruta]

Arriba estaba el comportamiento predeterminado de head. Y a continuación se especifica un número establecido de líneas.

tail

Tail es lo opuesto a head. Tail es un programa que imprime las últimas tantas líneas de su entrada. Por defecto imprimirá las últimas 10 líneas, pero podemos modificar esto con un argumento de línea de comandos.

tail [-número de líneas para imprimir] [ruta]

Arriba estaba el comportamiento predeterminado de tail. Y a continuación se especifica un número establecido de líneas.

sort

Sort ordenará tu entrada, agradable y simple. Por defecto, se ordenará alfabéticamente, pero hay muchas opciones disponibles para modificar el mecanismo de clasificación. Asegúrate de revisar la página del manual para ver todo lo que puede hacer.

sort [-opciones] [ruta]

nl

nl significa number lines (líneas numéricas) y hace exactamente eso.

nl [-opciones] [ruta]

El formato básico está bien, pero a veces buscas algo un poco diferente. Con algunas opciones de línea de comandos, nl se complace en hacerlo.

En el ejemplo anterior hemos usado 2 opciones de línea de comandos. El primer -s especifica qué se debe imprimir después del número, mientras que el segundo -w especifica cuánto relleno se debe colocar antes de los números.

Para el primero, necesitábamos incluir un espacio como parte de lo que se imprimió. Debido a que los espacios se usan normalmente como caracteres separadores en la línea de comandos, necesitábamos una forma de especificar que el espacio era parte de nuestro argumento y no solo entre argumentos. Lo hicimos al incluir el argumento rodeado de comillas.

wc

wc significa word count (recuento de palabras) y hace exactamente eso (además de caracteres y líneas). Por defecto, dará un recuento de los 3, pero usando las opciones de la línea de comandos podemos limitarlo a lo que buscamos.

wc [-options] [ruta]

A veces solo quieres uno de estos valores. -l solo nos dará líneas, -w nos dará palabras y -m nos dará caracteres. El siguiente ejemplo nos da solo un recuento de líneas.

También puedes combinar los argumentos de la línea de comando. Este ejemplo nos da líneas y palabras.

cut

cut es un pequeño y agradable programa para usar si tu contenido está separado en campos (columnas) y solo quieres ciertos campos.

cut [-opciones] [ruta]

En nuestro archivo de muestra tenemos nuestros datos en 3 columnas, la primera es un nombre, la segunda es una fruta y la tercera una cantidad. Digamos que solo queremos la primera columna.

cut por defecto el uso del caracter TAB como separador para identificar campos. En nuestro archivo, hemos usado un solo espacio en su lugar, por lo que debemos decirle a cut que lo usemos.

El caracter separador puede ser cualquier cosa que desees, por ejemplo, en un archivo CSV, el separador suele ser una coma (,). Esto es lo que hace la opción -d (incluimos el espacio entre comillas simples para que sepas que esto es parte del argumento).

La opción -f nos permite especificar qué campo o campos nos gustaría. Si queríamos 2 o más campos, los separamos con una coma como se muestra a continuación.

sed

sed significa Stream Editor y efectivamente nos permite hacer una búsqueda y reemplazar nuestros datos. Es un comando bastante poderoso, pero lo usaremos aquí en su formato básico.

sed <expresión> [ruta]

Una expresión básica tiene el siguiente formato:

  • s/search/replace/g

La s inicial significa sustituto y especifica la acción a realizar (hay otras, pero por ahora lo mantendremos simple). Luego, entre la primera y la segunda barra inclinada (/) colocamos lo que estamos buscando. Luego, entre la segunda y la tercera barra, lo que queremos reemplazar. La g al final significa global y es opcional.

Si lo omitimos, solo reemplazará la primera instancia de búsqueda en cada línea. Con la opción g, reemplazaremos cada instancia de búsqueda que se encuentre en cada línea. Veamos un ejemplo. Digamos que nos quedamos sin naranjas y queríamos darles bananas a esas personas.

Es importante tener en cuenta que sed no identifica palabras, sino cadenas de caracteres. Intenta ejecutar el ejemplo anterior, pero reemplaza las naranjas con es y verás lo que quiero decir.

El término de búsqueda también es en realidad algo llamado una expresión regular que es un medio para definir un patrón (similar a los comodines que vimos en la sección 7). Aprenderemos más sobre expresiones regulares en la siguiente sección y puedes usarlas para hacer que sed sea aún más poderoso.

También ten en cuenta que incluimos nuestra expresión entre comillas simples. Hicimos esto para que los caracteres incluidos en él que pueden tener un significado especial en la línea de comando no sean interpretados y actuados por la línea de comandos, sino que pasen a sed.

Truco

Un error común es olvidar las comillas simples, en cuyo caso puedes obtener un comportamiento extraño de la línea de comandos. Si esto sucede, es posible que debas presionar CTRL + c para cancelar el programa y volver al mensaje.

uniq

uniq significa único y su trabajo es eliminar líneas duplicadas de los datos. Sin embargo, una limitación es que esas líneas deben ser adyacentes (es decir, una después de la otra). (a veces este no es el caso, pero veremos una forma de solucionarlo más adelante).

uniq [opciones] [ruta]

Digamos que nuestro archivo de muestra en realidad se generó a partir de otro programa de ventas, pero después de una actualización de software tuviste algunos resultados defectuosos.

No te preocupes, podemos solucionarlo fácilmente usando uniq.

tac

Los chicos de Linux son conocidos por tener un sentido del humor divertido. El programa tac es en realidad cat invertido. Fue nombrado, así como hace lo contrario de cat. Dada la información, imprimirá la última línea primero, hasta la primera línea.

tac [ruta]

Tal vez nuestro archivo de muestra se genera escribiendo cada nuevo pedido al final del archivo. Como resultado, los pedidos más recientes están al final del archivo. Nos gustaría lo contrario para que los pedidos más recientes siempre estén en la parte superior.

Otros

Aquí hay otros dos programas que vale la pena investigar si deseas llevar tu conocimiento aún más lejos. Son bastante potentes, pero también más complejos que los programas enumerados anteriormente.

  • awk
  • diff

Resumen

Lo que aprendimos

head

Ver las primeras n líneas de datos.

tail

Ver las últimas n líneas de datos.

sort

Organiza los datos en orden.

nl

Imprimir números de línea antes de los datos.

wc

Imprime un recuento de líneas, palabras y caracteres.

cut

Corta los datos en campos y solo muestra los campos especificados.

sed

Hace una búsqueda y reemplaza los datos.

uniq

Eliminar líneas duplicadas.

tac

Imprime los datos en orden inverso.

Conceptos importantes

Procesamiento

Los filtros nos permiten procesar y formatear datos de formas interesantes.

páginas man

La mayoría de los programas que analizamos tienen opciones de línea de comandos que te permiten modificar su comportamiento.

Practicando lo aprendido

Vamos a desmenuzar algunos datos.

  • En primer lugar, es posible que desees crear un archivo con datos similares a nuestro archivo de muestra.
  • Ahora juega con cada uno de los programas que vimos anteriormente. Asegúrate de utilizar las rutas relativas y absolutas.
  • Echa un vistazo a la página de manual de cada uno de los programas y prueba al menos 2 de las opciones de línea de comandos para ellos.