Manipular texto con filtros

TEMARIO

Introducción

Trabajar con texto ha sido una parte fundamental del desarrollo de sistemas desde los primeros días de Unix. Doug McIlroy, uno de los pioneros en el desarrollo de Unix, resumió la filosofía de Unix con una frase que sigue siendo relevante hoy en día: «Escribe programas que manejen flujos de texto, porque esa es una interfaz universal». Esta idea ha sido fundamental para Unix y sus descendientes, incluido Linux, que adoptaron firmemente esta filosofía. Por lo tanto, en una distribución de Linux, un administrador puede esperar encontrar una amplia variedad de herramientas diseñadas para manipular texto de manera eficiente y efectiva.

Además, la capacidad de procesar texto de forma eficaz es fundamental para muchas tareas comunes de administración de sistemas, como el análisis de registros, la configuración de archivos de configuración y la automatización de tareas mediante scripts. Por lo tanto, entender cómo trabajar con texto de manera efectiva es una habilidad esencial para cualquier administrador de sistemas que trabaje en un entorno Unix o Linux.

Una revisión rápida sobre redirecciones y tuberías (Pipes)

Una forma importante de hacer que los programas trabajen juntos es mediante el uso de tuberías y redirecciones. La mayoría de los programas que manipulan texto recibirán texto desde tu teclado (entrada estándar), lo mostrarán en tu pantalla (salida estándar) y mostrarán errores también en tu pantalla (salida de error estándar). A menos que digas lo contrario, la entrada estándar será lo que escribas en tu teclado (el programa lo leerá después de que presiones Enter). Del mismo modo, lo que el programa muestre en la pantalla es su salida estándar y los errores también se mostrarán en la pantalla. Ahora veamos cómo funciona esto.

En su terminal, teclee cat y luego presione la tecla Enter. Luego teclee un texto al azar.

Si quieres aprender más sobre el comando «cat» (que viene de «concatenate»), puedes consultar las páginas del manual.

Como hemos visto anteriormente, si no se especifica de dónde debe leer cat, leerá desde la entrada estándar (lo que escriba) y enviará lo que lea a su ventana de terminal (su salida estándar).

Veamos lo siguiente:

El símbolo > (mayor que) indica a cat que dirija su salida al archivo miArchivoDeTexto, no a la salida estándar.

Llamando a cat con el nombre de archivo veremos el contenido del ejemplo anterior:

Muestra el contenido del archivo «miArchivoDeTexto».

Esto tiene el efecto de copiar el contenido de miArchivoDeTexto a un nuevo archivo llamado miNuevoArchivoDeTexto. En realidad, podemos verificar que estos dos archivos tengan el mismo contenido realizando un diff:

Si no hay salida, los archivos son iguales.

Como no hay salida, los archivos son iguales. Ahora intente con el operador de redireccionamiento anexado (>>):

Hasta ahora hemos usado redirecciones para crear y cambiar archivos. También podemos usar tuberías (se representan con el símbolo |) para enviar la salida de un programa a otro. Intentemos encontrar las líneas que contienen la palabra «esto«:

Ahora hemos canalizado la salida de cat a otro comando: grep. Note que usando la opción -i ignoramos mayúsculas y minúsculas mostrándonos una línea extra como resultado.

Procesando flujos de texto

Leer un archivo comprimido.- Crearemos un archivo llamado ftu.txt que contenga una lista de los siguientes comandos:

bzcat
cat
cut
head
less
md5sum
nl
od
paste
sed
sha256sum
sha512sum
sort
split
tail
tr
uniq
wc
xzcat
zcat

Ahora usaremos el comando grep para imprimir todas las líneas que contienen la cadena cat:

Recuerde que hay muchas formas de realizar la misma tarea con Linux.

Hay otros comandos que manejan archivos comprimidos (bzcat para archivos comprimidos bzip, xzcat para archivos comprimidos xz y zcat para archivos comprimidos gzip) y cada uno se usa para ver el contenido de un archivo comprimido basado en el algoritmo de compresión utilizado.

Verifique que el archivo recién creado ftu.txt sea el único en el directorio, luego cree una versión comprimida gzip del archivo:

Seguidamente, use el comando zcat para ver el contenido del archivo comprimido con gzip:

Tenga en cuenta que gzip comprimirá ftu.txt en ftu.txt.gz y eliminará el archivo original. Por defecto, no se mostrará ningún resultado del comando gzip. Sin embargo, si desea que gzip le diga qué está haciendo, use la opción -v para la salida “verbose”.

Ver un archivo paginado .- Sabemos que cat muestra el contenido de un archivo en la pantalla (después de escribir «cat» y luego el nombre del archivo). El archivo /var/log/syslog es donde tu sistema Linux guarda información importante sobre lo que está sucediendo. Usaremos el comando sudo para obtener permisos especiales y poder leer el archivo /var/log/syslog:

Vemos que los mensajes se desplazan muy rápido dentro de la ventana de su terminal. Podremos canalizar la salida hacia el programa less para que los resultados se paginen. Al usar less puede usar las teclas de flecha para navegar a través de la salida y también usar comandos similares a vi para navegar y buscar en todo el texto.

Obtener una parte de un archivo de texto.- Si solo necesitamos revisar el inicio o el final de un archivo, hay otros métodos disponibles. El comando head se usa para leer las primeras diez líneas de un archivo de manera predeterminada, y el comando tail se usa para leer las últimas diez líneas de un archivo de manera predeterminada. Por ejemplo:

Para ayudar a clarificar el número de líneas que se muestran, podemos canalizar la salida del comando head al comando nl, que mostrará el número de líneas de texto transmitidas al comando:

Podemos hacer lo mismo enviando la salida del comando tail al comando wc, que cuenta el número de palabras en un documento, y usando la opción «-l» para mostrar el número de líneas de texto que el comando ha leído:

Si un administrador necesita ver más (o menos) del inicio o el final de un archivo, puede usar la opción -n para controlar la cantidad de líneas que mostrará el comando:

Muestra las cinco últimas líneas del archivo syslog
Muestra las 11 primerass líneas del archivo syslog

Sed: Una Introducción al Editor de Flujo

Veamos otros archivos, términos y utilidades que no tienen cat en sus nombres. Podemos hacer esto usando la opción -v con grep, lo que le dice al comando que muestre solo las líneas que no contienen cat:

La mayoría de lo que podemos hacer con grep también se puede hacer con sed, que es un editor de flujo para filtrar y cambiar texto (como se explica en la página del manual de sed). Primero, vamos a obtener nuestro archivo ftu.txt descomprimiendo nuestro archivo gzip:

Ahora, podemos usar sed para listar solo las líneas que contienen la cadena cat:

Usamos el signo < para enviar el contenido del archivo ftu.txt al comando sed. La palabra entre barras (es decir, /cat/) es el término que estamos buscando. La opción -n le dice a sed que no muestre ninguna salida (excepto por las instrucciones posteriores del comando p). Prueba a ejecutar este mismo comando sin la opción -n para ver qué sucede.

Si no usamos la opción -n, sed imprimirá todo el contenido del archivo, excepto lo que la instrucción d le dice a sed que elimine de la salida.

Un uso común de sed es buscar y reemplazar texto dentro de un archivo. Suponga que desea cambiar cada aparición de cat a dog. Puede usar sed para hacer esto proporcionando la opción s para intercambiar cada instancia del primer término, cat, por el segundo término, dog:

En lugar de usar un operador de redirección (<) para pasar el archivo ftu.txt al comando sed, podemos hacer que el comando sed opere directamente en el archivo. Lo probaremos a continuación, mientras creamos simultáneamente una copia de seguridad del archivo original.

La opción -i permite a sed operar directamente en el archivo original. Si no usas .backup después de -i, sobreescribirá tu archivo original. Todo lo que escribas después de -i será el nombre con el que se guardará el archivo original antes de aplicar las modificaciones solicitadas a sed.

Garantizar la integridad de los datos

Hemos mostrado lo fácil que es manejar archivos en Linux. A veces, puede que quieras compartir un archivo con alguien y asegurarte de que esa persona obtenga una copia fiel del archivo original. Un caso común es cuando los servidores de distribución de Linux alojan imágenes descargables de CD o DVD junto con archivos que contienen los valores de suma de comprobación de esas imágenes de disco. Aquí tienes un ejemplo de un listado de un espejo de descargas de Debian:

En la lista anterior, los archivos de imagen del instalador de Debian tienen archivos de texto junto a ellos. Estos archivos de texto contienen números especiales que verifican si los archivos de imagen son correctos. Estos números son como códigos de seguridad y se llaman sumas de verificación. Hay diferentes tipos de estos códigos, como MD5, SHA1, SHA256 y SHA512. Cada uno de estos tipos de suma de verificación verifica la integridad de los archivos de imagen de diferentes maneras.

Una vez que descargue un archivo (por ejemplo, la imagen debian-10.1.0-amd64-netinst.iso), comparará la suma de comprobación del archivo que se descargó con el valor de
suma de comprobación que se le proporcionó.

Aquí hay un ejemplo que ilustrar el punto. Calcularemos el valor SHA256 del archivo ftu.txt utilizando el comando sha256sum:

La larga cadena de letras y números que se encuentra antes del nombre del archivo es el valor de la suma de comprobación SHA256 de este archivo de texto. Para utilizar esta suma de comprobación y verificar la integridad de nuestro archivo de texto original, necesitamos crear un archivo que contenga este valor. Podemos hacerlo utilizando el comando sha256sum y redirigiendo (>) su salida a un nuevo archivo. Es como hacer una copia de seguridad de la suma de comprobación en un lugar seguro para utilizarla más tarde.

Cuando queramos verificar el archivo ftu.txt, solo tenemos que usar el mismo comando y el nombre de archivo que contiene nuestro valor de suma de comprobación junto con -c:

El número que está en el archivo es igual a la suma de comprobación SHA256 que se calculó para nuestro archivo ftu.txt, justo como se esperaba. Pero, si alguien cambiara el archivo original (como si se perdieran algunos datos mientras se descargaba, o si alguien lo modificara a propósito), entonces la comprobación no sería igual. Si eso pasa, significa que nuestro archivo podría estar roto o corrupto, y no podemos estar seguros de que su contenido sea de confianza. Para ver cómo funciona, vamos a añadir texto al final del archivo (echo»nuevaentrada» >> ftu.txt):

Vemos que la suma de comprobación no coincide con lo que se esperaba para el archivo. Por lo tanto, no podemos confiar en la integridad de este archivo. Podríamos intentar descargar una nueva copia de un archivo, informar el fallo de la suma de verificación al remitente del archivo o informarlo al equipo de seguridad del centro de datos, según la importancia del archivo.

Explorando archivos

El comando octal dump (od) a menudo se usa para depurar aplicaciones y varios archivos. Por sí solo, el comando od solo enumerará el contenido de un archivo en formato octal. Podemos usar nuestro archivo ftu.txt anterior para practicar con este comando:

La primera columna de salida es el desplazamiento de bytes para cada línea de salida. Como od imprime la información en formato octal de manera predeterminada, cada línea comienza con el desplazamiento de bytes de ocho bits, seguido de ocho columnas, cada una con el valor octal de los datos dentro de esa columna. Recuerde que un byte tiene 8 bits de longitud.

Para ver el contenido de un archivo en formato hexadecimal, colocamos la opción -x:

Cada una de las ocho columnas está representada por sus equivalentes en hexadecimales.

El comando od es útil para depurar scripts. Por ejemplo, con od puedes ver caracteres que normalmente no son visibles en un archivo, como los saltos de línea. Al usar la opción -c, en lugar de mostrar números para cada byte, muestra los caracteres reales. Esto facilita la identificación de problemas con el formato de los archivos que estás procesando.

Las entradas de nueva línea dentro del archivo están representadas por los caracteres ocultos \n. Si solo desea ver todos los caracteres dentro de un archivo y no quiere ver la información de desplazamiento de bytes, la columna de desplazamiento de bytes se puede eliminar de la salida: