LPIC-1 103.2: procesar secuencias de texto usando filtros

Recupero la serie LPIC para tratar el tema 103.2 de estas certificaciones tan importantes en la industria para demostrar tus conocimientos sobre administración de sistemas GNU/Linux. En esta ocasión, el tema hace referencia a una serie de herramientas con las que se puede procesar secuencias de texto usando filtros. Por eso, en los exámenes LPIC-1 deberás demostrar que eres capaz de aplicar estos filtros a las cadenas de texto.

Dicho de otro modo, se pretenden medir tus competencias básicas sobre enviar ficheros de texto y salidas con cadenas de texto a través de utilidades para filtrar dicho texto, con el objetivo de modificar la salida usando comandos estándar de UNIX que se pueden encontrar en el paquete textutils de GNU.

Herramientas que debes dominar

Estas son las herramientas esenciales que puedes usar para esta tarea:

bzcat

Ya sabes que puedes comprimir y descomprimir ficheros de texto con herramientas como bzip2. Por ejemplo:

bzip2 nombre.txt
bzip2 -d nombre.txt.bz2

Pero si lo que quieres es descomprimir y que directamente se muestre el texto en la salida estándar (stdout), puedes usar lo siguiente:

bzcat -d nombre.txt.bz2

Me gustaría decir que zcat hace lo mismo en el caso de ficheros comprimidos con gzip, lrzcat haría lo mismo para ficheros comprimidos con lrzcat o lrzip, y xzcat para los comprimidos de xz. Por ejemplo:

xzcat nombre.txt.xz
zcat nombre.txt.gz

cat

Probablemente una de las herramientas más usadas y prácticas de todas. El concatenador puede servir para miles de utilidades. Pero básicamente debes saber que sirve para concatenar ficheros de texto y mostrar el contenido por la salida estándar (stdout). Algunos ejemplos son:

#Mostrar el contenido de un fichero de texto:
cat nombre.txt

#Mostrar el contenido de un fichero seguido de otro por la salida estándar:
cat nombre1.txt nombre2.txt

#Muestra el contenido de un fichero de texto numerando las líneas y solo numerando las líneas no vacías respectivamente:
cat -n nombre.txt
cat -b nombre.txt

#Añadir el contenido de un fichero a otro fichero (sobrescribe)
cat nombre1.txt > nombre2.txt

#Añadir el contenido de un fichero a otro al final (no sobrescribe)
cat nombre1.txt >> nombre2.txt

#Puedes hacer varias combinaciones, por ejemplo, añadir una línea de texto y el contenido de nombre1 en nombre2 a la vez
echo "Soy una linea para añadir al inicio" | cat - nombre1.txt > nombre2.txt

cut vs paste

Estos comandos, como su propio nombre indica, puede cortar y pegar texto. Tienen muchas utilidades, por ejemplo:

#Cortar solo el texto de un fichero con las cadenas de texto separadas por espacios de la primera línea
cut -d " " -f 1 nombre.txt

#Lo mismo, pero separa cadenas cuando se encuentra con un - en vez de un espacio y se incluye el contenido de la tercera línea también
cut -d "-" -f 1,3 nombre.txt

#Saca los primeros 10 caracteres de un fichero de texto
cut -c 1-10 nombre.txt

#Pegar el contenido en la stdout de dos ficheros de texto separados por espacios en dos columnas
paste nombre1.txt nombre2.txt

#Lo mismo al anterior, pero separar usando :
paste -d: nombre1.txt nombre2.txt

Recuerda que puedes combinarlos como quieras, además, en vez de usar espacios, guiones y dos puntos como separadores, puedes usar el carácter que quieras

less vs more

El filtro more permite mostrar la salida de un fichero de texto largo de una forma más controlada, para poder avanzar a través del texto paginado y no tener que hacer scroll en la pantalla. El comando less es más completo, permitiendo navegar libremente por el contenido mostrado. En principio, te pueden parecer similares al concatenador, pero no son iguales.

#Mostrar el contenido de texto paginado con more (puedes pasar usando la tecla espacio)
more nombre.txt

#Mostrar el contenido de texto paginado con less (puedes navegar usando las flechas abajo y arriba)
less nombre.txt

Para salir, recuerda que puedes pulsar la tecla q.

De igual forma que haces con man, de hecho, éste usa less. De hecho, si quieres, puedes modificar el «pager» que usa la herramienta man en los ficheros de configuración para que haga uso de cat, more, o lo que quieras, aunque esto no es demasiado práctico en la mayoría de casos.

md5sum, sha256sum, y sha512sum

Estas herramientas se usan para calcular el hash MD5, SHA256 y SHA512 respectivamente, y también para comprobar la suma y verificar que el fichero que se está comprobando no ha sido alterado. Muy práctico para comprobar que un binario no ha sido modificado, que una imagen no está corrupta, etc. Algunos ejemplos son:

#Mostrar el hash de un fichero
md5sum nombre.txt
md5sum --tag nombre.txt

#Calcular el hash de varios ficheros y luego comprobarlo
md5sum nombre1.txt nombre2.txt nombre3.txt >> sumas
md5sum --check sumas

Yo he usdado ejemplos con ficheros txt, pero pueden ser de cualquier tipo. Las herramientas sha256sum y sha512sum funcionan igual…

nl

Muestra el contenido de los ficheros con el número de línea con nl. Por ejemplo:

#Mostrar las líneas con contenido numeradas
nl nombre.txt

#Mostrar las líneas del contenido de un fichero, pero numerar también las que están vacías
nl -b a nombre.txt

#Mostrar los números de líneas con un incremento de 3 en 3
nl -i 3 nombre.txt

#Personalizar el separador entre el número y la línea, por ejemplo, usar :: como separador
nl -s :: nombre.txt

#Para más info, recuerda (por ejemplo, la opción -l contará las líneas vacías como una):
man nl

wc

Con esta herramienta podrás contar el número de líneas de un fichero. Por ejemplo:

#Cuenta el número de lineas de este fichero
wc -l nombre.txt

#Filtrar solo las líneas que quieres contar mediante awk para que solo muestre el número
wc -l nombre.txt | awk '{print $1}'

head vs tail

Con head muestra las primeras 10 líneas de un fichero o las que le indiques. Con tail lo mismo, pero para las últimas líneas. Por ejemplo:

#Mostrar 10 primeras líneas
head nombre.txt

#Mostrar solo las 5 primeras
head -n 5 nombre.txt

#Mostrar las últimas 10 líneas
tail nombre.txt

#Mostrar las últimas 5
tail -5 nombre.txt

od

Su nombre proviene de Octal Dump, y sirve para mostrar por stdout byte a byte el contenido de un fichero. A pesar de su nombre, también puede mostrar en hexadecimal, caracteres visibles, etc. Por ejemplo:

#Mostrar el contenido del fichero en bytes
od nombre.txt

#Mostrar el contenido carácter a carácter
od -c nombre.txt

#Verlo en hexadecimal
oc -ch nombre.txt

sed

Es un editor de texto no interactivo. Sus capacidades son muy amplias, pero también resulta complejo en cuanto a opciones. Por eso, te recomiendo que mires el manual. No obstante, aquí tienes algunos ejemplos:

#Sustituir palabra hola por azul marino en un fichero de texto
sed 's/hola/azul marino/' nombre.txt

#Se puede limitar el número de líneas sobre las que se pretende actuar a la línea 2 y 3 solo
sed '2,3s/hola/azul marino/' nombre.txt

#O desde la línea 3 hasta el final
sed '3,$s/hola/azul marino/' nombre.txt

#Sustituir al vuelo la palabra sitio por web de la stdin y mostrarlo por stdout
echo "Hola, esto es un mensaje del sitio" | sed 's/sitio/web/'

#En este caso se sustituyen varias palabras y en vez de usar un nombre en el directorio actual uso un path
sed -e 's/Hello/Hey/; s/Soledad/Nat/' /home/isaac/prueba

#También puedes guardar los comandos de modificación del texto todos en un fichero de texto (hacer), cada uno en una línea y luego usar sed para ejecutarlos todos en un lote
sed -f hacer nombre.txt

sort

El comando sort se usa para ordenar líneas de texto a partir de varios criterios:

#Ordenar en orden alfabético las líneas de un fichero de texto
sort nombre.txt

#Ordenar en orden alfabético, pero usando el segundo carácter de la línea como referencia
sort -k 2 nombre.txt

#Ordena por valor numérico
sort -n nombre.txt

#Ordena el valor a la inversa, es decir, de mayor a menor
sort -nr nombre.txt

#Ordena las líneas alfabéticamente, los pasa a uniq para que pueda contar las líneas iguales y luego la salida de uniq la pasa a la entrada de sort nuevamente mediante la tubería para mostrar las líneas más repetidas primero y las menos repetidas al final:
sort -bdf nombre.txt | uniq -ic | sort -nr

split

Permite dividir ficheros de texto, es decir, puedes usarlo como el opuesto a cat. Sería algo similar a Hoz o Hacha, los famosos programas para dividir ficheros. Por ejemplo:

#Dividir un fichero en ficheros de 1MB de tamaño (con nombres cortes.a cortes.b cortes.c...)
split -b 1m nombre.7z cortes.

#Para unirlos en uno solo nuevamente
cat cortes.* > nombre.7z

Puedes usar otros tamaños, como -b 20k para separar en porciones de 20KB, etc.

tr

Para sustituir y eliminar caracteres de un texto, puedes usar tr. Por ejemplo:

#Usa la stdin para pasar sus minúsculas a mayúsculas
echo "Hola, soy un mensaje" | tr a-z A-Z

#Sustituye los espacios en blanco por tabulaciones
echo "Hola, soy un mensaje" | tr [:space:] '\t'

#Suprime las repeticiones de espacios si los hay
echo "Hola   , soy un mensaje" | tr -s [:space:]

#Eliminar todos los caracteres e del mensaje
echo "Hola, soy un mensaje" | tr -d 'e'

#Elimina las letras y otros caracteres y deja solo los números
echo "Hola, 1, 2, 3" | tr -cd [:digit:]

#Unir todas las líneas de un fichero en una sola línea
tr -s '\n' ' ' < nombre.txt

uniq

Por último, uniq permite eliminar o mostrar las líneas repetidas de un texto. Lo puede hacer desde la stdin o desde un fichero. Por ejemplo:

#Solo mostrar las líneas no repetidas (pero no modifica el fichero original)
uniq nombre.txt

#Muestra el número de repeticiones de cada línea
uniq -c nombre.txt

#Solo mostrar las líneas duplicadas
uniq -D nombre.txt

#Usar el segundo campo de cada línea como referencia para determinar si son o no iguales
uniq -f  2 nombre.txt

#Para más opciones
man uniq

Ya sabes que para más información sobre cada una de ellas, y poder aprender más opciones, puedes consultar las páginas del manual usando man.

Isaac

Apasionado de la computación y la tecnología en general. Siempre intentando desaprender para apreHender.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

A %d blogueros les gusta esto:

Si continuas utilizando este sitio aceptas el uso de cookies. más información

Los ajustes de cookies de esta web están configurados para "permitir cookies" y así ofrecerte la mejor experiencia de navegación posible. Si sigues utilizando esta web sin cambiar tus ajustes de cookies o haces clic en "Aceptar" estarás dando tu consentimiento a esto.

Cerrar