Comandos Linux. Filtros y Redireccionamiento

Las tuberías o filtros se utilizan en una línea de comandos para conectar la salida estándar de un comando con la entrada estándar de otro. Para ello se utiliza el caracter |.

Las redirecciones son una de las funcionalidades más importantes que proporciona el intérprete de comandos. Redireccionar implica la posibilidad de:

  • Redirigir la visualización de la pantalla hacia un archivo, impresora o cualquier otro periférico
  • Redirigir los mensajes de error hacia un archivo, impresora o cualquier otro periférico
  • Sustituir la introducción vía teclado por el contenido de un archivo.

Linux utiliza canales de entrada/salida para leer y escribir sus datos. Cualquier proceso tiene una entrada estándar, stdin, y dos salidas, la salida estándar, stdout, y la salida de errores, stderr.

Normalmente, la entrada estandar, stdin, es el teclado y la salida estándar, stdout, es la pantalla, pero si se produjo un error en la ejecución del proceso la salida por pantalla corresponderá a la salida de errores stderr.

Sin embargo puede que queramos cambiar la entrada estándar, la salida estándar o la salida de errores por un fichero. Para ello utilizamos los redireccionamientos, con los siguientes caracteres:

  • < Redirecciona la entrada estándar sustituyéndola por el archivo que se le indique.
  • > Redirecciona la salida de un proceso al fichero que se le indique, borrando la información que le fichero contenía.
  • >> Redirecciona la salida de un proceso al fichero que se le indique, pero añadiéndola al final del fichero, sin borrar su contenido previo.
  • 2> Redirecciona la salida de errores de un proceso al fichero que se le indique, borrando la información que el fichero contenía.
  • 2>> Redirecciona la salida de errores de un proceso al fichero que se le indique, pero añadiéndola al final del fichero, sin borrar su contenido previo.

En todos los casos, si el fichero indicado no existe, se crea.

Un filtro (o comando filtro) es un programa que puede escribir y leer datos por los canales estándares de entrada/salida y modifica o procesa el contenido.

Las herrammientas no siempre se comportan como filtros. Permiten realizar una serie de acciones en archivos y su contenido, como por ejemplo dar formato o imprimir.

Permite extraer el nombre de un archivo en una ruta

$ basename /usr/bin/tree
tree

Extrae la ruta de un archivo

$ dirname /usr/bin/tree
/usr/bin

Muestra las líneas de un fichero dado que coinciden con un cierto patrón

Sintaxis:

grep [opciones] patrón [fichero/s]

Opciones:

  • -r|-R| –recursive

Para buscar de forma recursiva dentro de los ficheros de un directorio.

  • -n|–line-number

Muestra el número correspondiente al lugar que ocupa en el fichero la línea encontrada.

  • -i|–ignore-case

No distingue entre mayúsculas y minúsculas.

  • -v|–invert-match

Muestra las líneas que no se corresponden con el patrón.

  • -c|–count

Escribe el número de líneas que satisfacen la condición.

  • -l|–files-with-matches

Se escriben los nombres de los ficheros que contienen las líneas buscadas.

Patrón:

  • texto líneas que contengan la cadena “texto”
  • ^texto líneas que empiezan por “texto”
  • texto$ líneas que terminan por “texto”

Ejemplos

Líneas que contiene la cadena de caracteres ivan en el fichero /etc/passwd

$ grep ivan /etc/passwd
ivan:x:1000:1000:ivan,,,:/home/ivan:/bin/bash

Utilizando tuberías:

$ cat /etc/passwd | grep ivan
ivan:x:1000:1000:ivan,,,:/home/ivan:/bin/bash

Líneas que terminan por bash en el fichero /etc/passwd

$ grep bash /etc/passwd
root:x:0:0:root:/root:/bin/bash
ivan:x:1000:1000:ivan,,,:/home/ivan:/bin/bash
couchdb:x:114:126:CouchDB Administrator,,,:/var/lib/couchdb:/bin/bash
user:x:1001:1001:user,,,:/home/user:/bin/bash

Muestra sólo ciertas líneas verticales (campos) de los ficheros que se le pasen como argumento.

Sintaxis:

cut [opciones] [fichero/s]

Opciones:

  • -c|–characters=lista

Muestra solo los caracteres que se le especifiquen

  • -d|–delimiter=delim

Usa el caracter que se le especifique como delimitador en vez del tabulador

  • -f|–fields=lista

Muestra solo los campos que se le indiquen en lista. Puede ser un campo, una serie de campos separados por comas, y un rango

  • -s|–ooonly-delimited

No muestra las líneas que contengan el delimitador.

  • --output-delimiter=cadena

Usa cadena como delimitador de salida en vez del delimitador de la entrada.

Ejemplos

Muestra los campos 1, 3 y 7 del fichero /etc/passwd

$ cut -d: -f1,3,7 /etc/passwd
root:0:/bin/bash
daemon:1:/bin/sh
bin:2:/bin/sh
...

Muestra los campos del 3 al 5 del fichero /etc/passwd

$ cut -d: -f3-5 /etc/passwd
0:0:root
1:1:daemon
2:2:bin
3:3:sys

Muestra a partir del tercer campo del fichero /etc/passwd

$ cut -d: -f3- /etc/passwd
0:0:root:/root:/bin/bash
1:1:daemon:/usr/sbin:/bin/sh
2:2:bin:/bin:/bin/sh
3:3:sys:/dev:/bin/sh

Uso de tuberías. Muestra el nombre de usuario, el UID y el shell del usuario ivan. Sustituye el delimitador “:” por un espacio.

$ grep ivan /etc/passwd | cut -d: -f1,3,7 --output-delimiter=" "
ivan 1000 /bin/bash

Muestra el número de líneas, palabras, caracteres y/o bytes de los ficheros que se le indiquen, o el tamaño de la línea más larga.

Sintaxis:

wc [opciones] fichero/s

Opciones:

  • -c|–bytes

Muestra el número de bytes

  • -m|–chars

Muestra el número de caracteres

  • -l|–lines

Muestra el número de líneas.

  • -w|–words

Muestra el número de palabras.

  • -L|–max-line-length

Muestra el tamaño de la línea más larga del fichero

Ejemplos

Número de líneas y de palabras del fichero /etc/passwd

$ wc -l -w /etc/passwd
  41   67 /etc/passwd

Utilizando tuberías. Número de usuarios del sistema que utilizan /bin/bash como shell:

$ grep /bin/bash$ /etc/passwd | wc -l
4

Muestra en orden ascendente, descendente o numérico el contenido de los ficheros que se les pasa como argumentos.

Sintaxis:

sort [opciones] [fichero/s]

Opciones:

  • -c|–check

Comprueba que el fichero esté ordenado, pero no lo ordena. Si no está ordenando te muestra un mensaje mostrando la primera línea que está fuera de orden.

  • -r|–reverse

Ordena en sentido inverso.

  • -n|–numeric

Ordena por orden numérico en lugar de alfabético que es la opción por defecto.

  • -u|–unique

Elimina las líneas repetidas

  • -k <pos1>

Permite especificar el campo utilizado para ordenar

  • -t<delimitador>

Permite especificar el delimitador de campo a utilizar

Ejemplos

Muestra el fichero /etc/passwd en orden inverso

$ sort -r /etc/passwd
www-data:x:33:33:www-data:/var/www:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
user:x:1001:1001:user,,,:/home/user:/bin/bash
usbmux:x:107:46:usbmux daemon,,,:/home/usbmux:/bin/false
sys:x:3:3:sys:/dev:/bin/sh

Ordena en orden númerico inverso a partir del GID (campo 4, delimitador de campos :) el fichero /etc/passwd

$ sort -n -r -k 4 -t: /etc/passwd
sync:x:4:65534:sync:/bin:/bin/sync
sshd:x:122:65534::/var/run/sshd:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
lxd:x:117:65534::/var/lib/lxd/:/bin/false
kernoops:x:106:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false
gnome-initial-setup:x:140:65534::/run/gnome-initial-setup/:/bin/false
fetchmail:x:128:65534::/var/lib/fetchmail:/bin/false
dnsmasq:x:104:65534:dnsmasq,,,:/var/lib/misc:/bin/false
_apt:x:136:65534::/nonexistent:/bin/false
usuario:x:1000:1000:usuario,,,:/home/usuario:/bin/bash
vnstat:x:143:152:vnstat daemon,,,:/var/lib/vnstat:/usr/sbin/nologin
sddm:x:141:151:Simple Desktop Display Manager:/var/lib/sddm:/bin/false
redis:x:135:149::/var/lib/redis:/usr/sbin/nologin
...

Utilizando tuberías. Muestra por orden numérico el UID, el GID y el shell de la información contenida en /etc/passwd

$ cut -d: -f3,4,6 /etc/passwd | sort -n 
0:0:/root
1:1:/usr/sbin
2:2:/bin
3:3:/dev
4:65534:/bin
5:60:/usr/games
6:12:/var/cache/man
7:7:/var/spool/lpd
8:8:/var/mail
9:9:/var/spool/news
10:10:/var/spool/uucp
13:13:/bin
33:33:/var/www
34:34:/var/backups
38:38:/var/list
39:39:/var/run/ircd
41:41:/var/lib/gnats
100:101:/var/lib/libuuid
101:103:/home/syslog
102:105:/var/lib/colord
103:107:/var/run/dbus
104:108:/var/lib/lightdm
105:112:/var/lib/avahi-autoipd
106:113:/var/run/avahi-daemon
107:46:/home/usbmux
108:65534:/
109:119:/var/run/pulse
110:122:/proc
111:29:/var/run/speech-dispatcher
112:7:/var/run/hplip
113:123:/home/saned
114:126:/var/lib/couchdb
115:65534:/var/run/sshd
116:127:/var/cache/bind
117:128:/nonexistent
118:129:/var/lib/gdm
119:130:/home/ntp
120:131:/var/lib/clamav
1000:1000:/home/ivan
1001:1001:/home/user
65534:65534:/nonexistent

El comando tr dado un flujo de datos (entrada estándar) nos permite modificarlos sustituyendo y/o borrando carácteres. tr [OPCIÓN] … SET1 [SET2]

Sintaxis:

tr [OPCIÓN] … SET1 [SET2]

Opciones:

  • -d Borrar los carácteres indicados en SET1
  • -s Elimina o reemplaza los carácteres repetidos indicados en SET1
  • -c Todos los carácteres que no sean los indicados en SET1 los convierte en SET2
  • -t Trunca SET1 a la longitud de SET2

Ejemplos

Pasar las vocales a mayúsculas

$ echo murcielago | tr aeiou AEIOU
mUrcIElAgO

Mostrar el contenido de /etc/passwd sustituyendo los dos puntos “:” por espacios “ ”

$ cat /etc/passwd | tr : " "
root x 0 0 root /root /bin/bash
bin x 1 1 bin /bin /bin/false
daemon x 2 2 daemon /sbin /bin/false
mail x 8 12 mail /var/spool/mail /bin/false
...

Mostrar el contenido de la carpeta actual en formato largo eliminando los espacios duplicados

$ ls -l | tr -s " "
total 42996
-rw-r--r-- 1 ivan users 221623 oct 26 22:31 143354-AdwaitaWolfeV4.tar.gz
-rw-r--r-- 1 ivan users 128 ago 25 16:05 AUTHORS
-rw-r--r-- 1 ivan users 1138 nov 16 13:32 ChangeLog
...

Algunos de ellos son:

  • Página por página: pg, more, less
  • En bloque: cat
  • Al revés: tac
  • Volcado hexadecimal: hexdump
  • Creación de un banner: banner
  • Formateo para impresión: pr
  • Numeración de líneas: cat -n, nl

Para ver el principio de un archivo, utilizamos el comando head. Si no se especifica la cantidad de información a mostrar se mostrarán las 10 primeras líneas.

opciones

  • -c <numbytes>: número de bytes del encabezamiento a visualizar
  • -n <num> o -<num>: número de líneas a mostrar

Ejemplos

Muestra las primeras 5 líneas de fichero /etc/passwd

$ head -5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync

Ordena de forma inversa el fichero /etc/passwd y muestra las 4 primeras líneas

$ sort -r /etc/passwd | head -n 4
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
whoopsie:x:109:116::/nonexistent:/bin/false
vnstat:x:143:152:vnstat daemon,,,:/var/lib/vnstat:/usr/sbin/nologin
uuidd:x:100:101::/run/uuidd:/bin/false

Para ver el final de un archivo, utilizamos el comando tail. Si no se especifica la cantidad de información a mostrar se mostrarán las 10 últimas líneas.

opciones

  • -<numbytes>c: número de bytes del final a visualizar
  • -<num>: número de líneas del final a mostrar
  • -f: deja el archivo abierto, lo que nos permite ver en vivo las líneas que se van añadiendo al archivo.

El comando column permite dar formato de tabla a la salida de un comando.

Opciones

  • -t: determina cuantas columnas se mostrarán en la salida y añade espacios para alinearlas
  • -s<caracter>: permite indicar el caracter separador

Ejemplo

$ tac /etc/group | head -10 | column -t -s:
test                   x  1003
vnstat                 x  152
sddm                   x  151
libvirt-dnsmasq        x  150
libvirt-qemu           x  64055  libvirt-qemu
libvirt                x  137    usuario
redis                  x  149
rdma                   x  144
lxd                    x  130    usuario
chrome-remote-desktop  x  1005   usuario

En algunos casos puede ser necesario colocar el resultado de un comando en un archivo y a la vez filtrar el mismo resultado con otro comando.

Para este tipo de acciones podemos utilizar el comando tee que permite duplicar el flujo de datos.

El comando tee lee el flujo de datos que proviene de otro comando por el canal de entrada , lo escribe en un archivo y restituye el flujo de forma idéntica por el canal de salida. Por defecto el archivo generado sobreesdcribe el antiguo si existe

opciones

  • -a: añade al fichero en lugar de sobreescribirlo.

Ejemplo

Si queremos escribir todos los usuarios del sistema en un fichero y mostrar por pantalla los 6 primeros:

$ cat /etc/passwd | cut -f1 -d: | tee usuarios.txt | head -6
root
daemon
bin
sys
sync
games
$ cat usuarios.txt 
root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
proxy
www-data
backup
...

Permite esperar el número de segundos indicados

Ejemplo

$ sleep 10