-
Notifications
You must be signed in to change notification settings - Fork 0
03 Pipelines
Los pipelines son una funcionalidad de los shells que permite enviar el
stdout de un comando como stdin de otro comando. Esto se efectúa mediante el
operador pipe |:
admin@server:~$ comando1 | comando2Donde el comando1 le pasa su stdout como stdin al comando2.
Por ejemplo:
admin@server:~$ tree ~ | lessNote
Es importante aclarar que los pipelines solo pasan el stdout del comando anterior, no el stderr. El stderr se sigue mostrando en la terminal a menos que se redirija explícitamente.
Haciendo uso de los pipelines podemos filtrar datos (texto) a través de una serie de comandos. Los filtros toman un input, lo modifican de alguna forma y luego lo envían como un output.
Existen muchos comandos que se pueden utilizar como filtros. En este documento mostraremos (sin profundizar) algunos de los filtros más populares.
Tip
Si bien puedes utilizar el comando cat para imprimir (o extraer) el
contenido de un archivo y pasárselo a un comando usando un pipe |, por
ejemplo:
admin@server:~$ cat archivo | sortEvita utilizarlo si el comando acepta archivos como argumento, ya que esto es innecesario y consume más recursos. Por lo tanto, el ejemplo anterior puede ser reescrito de la siguiente forma:
admin@server:~$ sort archivoNote
Para algunos ejemplos de filtros, utilizaremos el siguiente comando:
admin@server:~$ ls /bin /usr/binEste comando imprime los programas ejecutables (comandos) instalados en el sistema.
Con el comando sort, podemos filtrar el output de un comando, ordenando cada
una de las líneas de texto (alfabéticamente por defecto), por ejemplo:
admin@server:~$ ls /bin /usr/bin | sortCon el comando uniq, podemos filtrar el output (ordenado) de un comando,
eliminando las líneas repetidas, por ejemplo:
admin@server:~$ ls /bin /usr/bin | sort | uniqTip
Para que uniq funcione correctamente, el stdin debe estar previamente
ordenado (o al menos que las líneas repetidas estén juntas), para ello
utilizamos el comando sort como filtro.
Con el comando wc, podemos filtrar el output de un comando, imprimiendo la
cantidad de líneas, palabras y bytes de dicho output, por ejemplo:
admin@server:~$ ls /bin /usr/bin | sort | uniq | wcAsimismo, podemos agregar la opción -l, para que solamente imprima el número
de líneas, por ejemplo:
admin@server:~$ ls /bin /usr/bin | sort | uniq | wc -lCon el comando grep, podemos filtrar el output de un comando, imprimiendo
aquellas líneas que contengan cierto patrón de texto, por ejemplo:
admin@server:~$ sort ~/.bash_history | uniq | grep apt installNote
El comando anterior muestra (alfabéticamente y sin repeticiones) las líneas
que contengan apt install (comandos usados para instalar programas con el
package manager apt) en el historial de comandos de bash
(~/.bash_history).
Con el comando head, podemos filtrar el output de un comando, imprimiendo
las primeras 10 líneas, por ejemplo:
admin@server:~$ ls /bin /usr/bin | sort | uniq | headTambién podemos especificar cuántas primeras líneas mostrar, por ejemplo:
admin@server:~$ ls /bin /usr/bin | sort | uniq | head -n 5
admin@server:~$ ls /bin /usr/bin | sort | uniq | head -5Con el comando tail, podemos filtrar el output de un comando, imprimiendo
las últimas 10 líneas, por ejemplo:
admin@server:~$ ls /bin /usr/bin | sort | uniq | tailTambién podemos especificar cuántas últimas líneas mostrar, por ejemplo:
admin@server:~$ ls /bin /usr/bin | sort | uniq | tail -n 5
admin@server:~$ ls /bin /usr/bin | sort | uniq | tail -5Con el comando nl, podemos filtrar el output de un comando, enumerando cada
una de las líneas, por ejemplo:
admin@server:~$ sort ~/.bash_history | uniq | grep apt install | nlEl comando cut es un comando que permite remover secciones específicas de texto de las líneas de un archivo. Es usado principalmente para archivos con delimitadores (e.g., CSV, TSV, PSV).
Con el comando cut, podemos filtrar el output de un comando mediante delimitadores, por ejemplo:
admin@server:~$ sort /etc/passwd | cut -d : -f 1,5-7Donde:
-
La opción -d especifica el delimitador (sin esta opción, el delimitador por defecto es el tab); en este caso : (
-d :) -
La opción -f especifica los números de los campos a visualizar; en este caso, el campo 1, y del 5 al 7 (
-f 1,5-7). Estos campos del archivo /etc/passwd son usuario, descripción, directorio home y shell predeterminado respectivamente.
Con el comando cut, podemos filtrar el output de un comando extrayendo
caracteres (-c) o bytes (-b) de cada línea, especificando su posición, por
ejemplo:
admin@server:~$ echo -e "Valeria\nEduardo\nElisa" | cut -b 1-3,6
Vali
Edud
Eli
admin@server:~$ echo -e "Valeria\nEduardo\nElisa" | cut -c 1-3,6
Sana
Edud
EliEl comando anterior imprime los primeros tres bytes/caracteres y el sexto byte/carácter de una lista de nombres.
Important
De momento la opción -b y -c se comportan de la misma manera. La opción -c
debería tener soporte para caracteres multibyte (caracteres que ocupan más de
un byte), tales como ¿, ñ, á, por ejemplo:
admin@server:~$ echo "Andrés" | cut -b 5
�
admin@server:~$ echo "Andrés" | cut -c 5
éCon el comando tee, podemos imprimir el output de un comando y, al mismo
tiempo, guardarlo en un archivo, por ejemplo:
admin@server:~$ sort ~/.bash_history | uniq | grep apt install | tee apt-install.txtEl comando anterior muestra y guarda en el archivo apt-install.txt
(alfabéticamente y sin repeticiones) las líneas que contengan apt install
(comandos usados para instalar programas con el package manager apt) en el
historial de comandos de bash (~/.bash_history).
Con la opción -a o --append, podemos añadir texto en un archivo en vez de
sobreescribirlo, por ejemplo:
admin@server:~$ sort ~/.bash_history | uniq | grep apt install | tee -a apt-install.txt- Shotts, W. (2019). Redirection. The Linux Command Line (2nd ed., pp. 49-60). No Starch Press.
- Definición y Estructura de un Shell
- Los Diferentes Tipos de Shell
- Definición y Sintaxis de un Comando
- Variables, Alias y Funciones
- Comandos de Utilidad y Consulta
- Linux como Sistema Multiusuario
- Introducción a los Usuarios y Grupos
- Gestión de Usuarios
- Gestión de Grupos
- Gestión de Contraseñas
- Búsqueda de Información de Usuarios y Grupos con
getent
- Atributos de Archivos: Propiedad y Permisos de los Archivos
- Cambio de Propiedad y Permisos
umask: Permisos Predeterminados de Archivos- Cambio de Identidad y Privilegios
- Gestión de Paquetes (Package Management)
- Compresión y Archivado de Archivos
- Optimización y Conversion de Archivos