Utilice canalizaciones de Linux para coreografiar cómo colaboran las utilidades de línea de comandos. Simplifique procesos complejos y aumente su productividad aprovechando una colección de comandos independientes y convirtiéndolos en un equipo único. Te mostramos cómo.
¿De qué vamos a hablar?
Las tuberías están en todas partes
Las canalizaciones son una de las características de línea de comandos más útiles que tienen los sistemas operativos Linux y Unix. Las tuberías se utilizan de innumerables maneras. Mire cualquier artículo de línea de comandos de Linux, en cualquier sitio web, no solo en el nuestro, y verá que las tuberías aan apariencia la mayoría de las veces. Revisé algunos de los artículos de Linux de How-To Geek, y las tuberías se usan en todos ellos, de una manera u otra.
Las canalizaciones de Linux le permiten realizar acciones que no son compatibles de forma inmediata con el cáscara. Pero debido a que la filosofía de diseño de Linux es tener muchas utilidades pequeñas que realicen su función dedicada muy bien, y sin una funcionalidad innecesaria, el mantra “haz una cosa y hazlo bien”, puedes sondear cadenas de comandos junto con tuberías para que la salida de un comando se convierta en la entrada de otro. Cada comando que canalizas aporta su talento único al equipo, y pronto descubres que has reunido un escuadrón ganador.
Un ejemplo sencillo
Supongamos que tenemos un directorio lleno de muchos tipos diferentes de archivos. Queremos saber cuántos archivos de un determinado tipo hay en ese directorio. Hay otras formas de hacer esto, pero el objetivo de este ejercicio es introducir tuberías, así que lo vamos a hacer con tuberías.
Podemos obtener una lista de los archivos fácilmente usando ls
:
ls
Para separar el tipo de archivo de interés, usaremos grep
. Queremos encontrar archivos que tengan la palabra “página” en su nombre de archivo o extensión de archivo.
Usaremos el personaje especial de la concha”|
” para canalizar la salida de ls
en grep
.
ls | grep "page"
grep
imprime líneas que coincidir con su patrón de búsqueda. Así que esto nos da una lista que contiene sólo archivos “.page”.
Incluso este ejemplo trivial muestra la funcionalidad de las tuberías. El resultado de ls
no se envió a la ventana del terminal. Fue enviado a grep
como datos para el grep
comando con el que trabajar. La salida que vemos proviene de grep,
que es el último comando de esta cadena.
Ampliando nuestra cadena
Comencemos a extender nuestra cadena de comandos canalizados. Podemos contar los archivos “.page” añadiendo el wc
mandar. Utilizaremos el -l
(recuento de líneas) opción con wc
. Tenga en cuenta que también hemos agregado el -l
(formato largo) opción a ls
. Usaremos esto en breve.
ls - | grep "page" | wc -l
grep
ya no es el último comando de la cadena, por lo que no vemos su salida. El resultado de grep
se alimenta en el wc
mandar. La salida que vemos en la ventana del terminal es de wc
. wc
informa de que hay 69 archivos “.page” en el directorio.
Vamos a extender las cosas de nuevo. Tomaremos el wc
desactiva la línea de comandos y reemplázalo por awk
. Hay nueve columnas en la salida de ls
con el -l
opción (formato largo). Usaremos awk
Para imprimir columnas cinco, tres y nueve. Estos son el tamaño, el propietario y el nombre del archivo.
ls -l | grep "page" | awk '{print €5 " " €3 " " €9}'
Obtenemos una lista de esas columnas, para cada uno de los archivos coincidentes.
Ahora pasaremos esa salida a través del sort
mandar. Usaremos el -n
(numérica) opción para dejar sort
saber que la primera columna debe ser tratados como números.
ls -l | grep "page" | awk '{print €5 " " €3 " " €9}' | sort -n
La salida ahora se ordena en orden de tamaño de archivo, con nuestra selección personalizada de tres columnas.
Agregar otro comando
Terminaremos añadiendo el tail
mandar. Le diremos que enumere el últimas cinco líneas de salida solamente.
ls -l | grep "page" | awk '{print €5 " " €3 " " €9}' | sort -n | tail -5
Esto significa que nuestro comando se traduce en algo así como “muéstrame los cinco archivos “.page” más grandes de este directorio, ordenados por tamaño”. Por supuesto, no hay ningún comando para lograr eso, pero mediante el uso de tuberías, hemos creado las nuestras. Podríamos agregar esto, o cualquier otro comando largo, como un alias o función de shell para guardar toda la escritura.
Aquí está el resultado:
Podríamos invertir el orden de tamaño agregando el -r
(inversa) opción a la sort
y utilizando head
En lugar de tail
para elegir las líneas desde la parte superior de la salida.
Esta vez, los cinco archivos “.page” más grandes se enumeran de mayor a menor:
Algunos ejemplos recientes
Aquí hay dos interesantes ejemplos de artículos geek recientes de How-To.
Algunos comandos, como el xargs
comando, están diseñados para tener la entrada canalizada a ellos. Aquí hay una manera que podemos tener wc
contar el palabras, caracteres y líneas en varios archivos, mediante canalización ls
en xargs
que, a continuación, alimenta la lista de nombres de archivo a wc
como si se hubieran pasado a wc
como parámetros de línea de comandos.
ls *.page | xargs wc
El número total de palabras, caracteres y líneas se enumeran en la parte inferior de la ventana del terminal.
Aquí hay una manera de obtener una lista ordenada de las extensiones de archivo únicas en el directorio actual, con un recuento de cada tipo.
ls | rev | cut -d'.' -f1 | rev | sort | uniq -c
Aquí están pasando muchas novedades.
- ls: Enumera los archivos del directorio
- Rev: Invierte el texto en los nombres de archivo.
- cortar: Corta la cadena en la primera aparición del delimitador especificado “.”. El texto después de esto se descarta.
- Rev: invierte el texto restante, que es la extensión del nombre de archivo.
- ordenar: Ordena la lista alfabéticamente.
- uniq: Cuenta el número de cada uno entrada única en la lista.
El resultado muestra la lista de extensiones de archivo, ordenadas alfabéticamente con un recuento de cada tipo único.
Canalizaciones
Hay otro tipo de tubería disponible para nosotros, llamadas tuberías con nombre. Las canalizaciones de los ejemplos anteriores son creadas sobre la marcha por el shell cuando procesa la línea de comandos. Las tuberías se crean, se utilizan y, a continuación, se descartan. Son transitorios y no dejan rastro de sí mismos. Existen solo mientras se ejecute el comando que los usa.
Las canalizaciones con nombre aparecen como objetos persistentes en el sistema de archivos, por lo que puede verlas utilizando ls
. Son persistentes porque sobrevivirán a un reinicio de la computadora, aunque cualquier dato no leído en ellos en ese momento será descartado.
Las tuberías con nombre se usaron mucho a la vez para permitir que diferentes procesos envíen y reciban datos, pero no he visto que se usen de esa manera durante mucho tiempo. Sin duda, hay personas que todavía los usan con gran efecto, pero no he encontrado ninguno recientemente. Pero por el bien de la integridad, o simplemente para satisfacer su curiosidad, así es como puede usarlos.
Las canalizaciones con nombre se crean con el mkfifo
mandar. Este comando creará una canalización con nombre llamado “geek-pipe” en el directorio actual.
mkfifo geek-pipe
Podemos ver los detalles de la tubería con nombre si usamos el ls
con el comando -l
(formato largo) opción:
ls -l geek-pipe
El primer carácter de la lista es una “p”, lo que significa que es una tubería. Si fuera una “d”, significaría que el objeto del sistema de archivos es un directorio, y un guión “-” significaría que es un archivo normal.
Uso de la canalización con nombre
Usemos nuestra pipa. Las canalizaciones sin nombre que utilizamos en nuestros ejemplos anteriores pasaron los datos inmediatamente del comando de envío al comando de recepción. Los datos enviados a través de una tubería con nombre permanecerán en la tubería hasta que se lean. Los datos se mantienen realmente en la memoria, por lo que el tamaño de la tubería con nombre no variará en ls
enumera si hay datos en él o no.
Vamos a usar dos ventanas de terminal para este ejemplo. Usaré la etiqueta:
# Terminal-1
en una ventana de terminal y
# Terminal-2
en el otro, para que puedas diferenciar entre ellos. El hash “#” le dice al shell que lo que sigue es un comentario y que lo ignore.
Tomemos la totalidad de nuestro ejemplo anterior y redirijamos eso a la tubería con nombre. Así que estamos usando canalizaciones sin nombre y con nombre en un comando:
ls | rev | cut -d'.' -f1 | rev | sort | uniq -c > geek-pipe
Nada parecerá suceder. Sin embargo, puede notar que no se le devuelve al símbolo del sistema, por lo que algo está pasando.
En la otra ventana del terminal, emita este comando:
cat < geek-pipe
Estamos redirigiendo el contenido de la tubería con nombre a cat
Para cat
mostrará ese contenido en la segunda ventana del terminal. Aquí está el resultado:
Y verá que ha sido devuelto al símbolo del sistema en la primera ventana del terminal.
Entonces, lo que acaba de suceder.
- Redirigimos parte de la salida a la tubería con nombre.
- La primera ventana del terminal no volvió al símbolo del sistema.
- Los datos permanecieron en la tubería hasta que se leyeron desde la tubería en el segundo terminal.
- Nos devolvieron al símbolo del sistema en la primera ventana del terminal.
Es posible que esté pensando que podría ejecutar el comando en la primera ventana del terminal como una tarea en segundo plano agregando un &
al final del comando. Y tendría razón. En ese caso, nos gustaríaave ha sido devuelto al símbolo del sistema inmediatamente.
El punto de no El uso del procesamiento en segundo plano era resaltar que una canalización con nombre es una proceso de bloqueo. Poner algo en una tubería con nombre solo abre un extremo de la tubería. El otro extremo no se abre hasta que el programa de lectura extrae los datos. El kernel suspende el proceso en la primera ventana del terminal hasta que los datos se leen desde el otro extremo de la tubería.
El poder de las tuberías
Hoy en día, las tuberías con nombre son algo así como un acto de novedad.
Las tuberías simples y antiguas de Linux, por otro lado, son una de las herramientas más útiles que puede tener en su kit de herramientas de ventana de terminal. La línea de comandos de Linux comienza a cobrar vida para usted, y obtiene un potenciamiento completamente nuevo cuando puede orquestar una colección de comandos para producir una actuación cohesiva.
Sugerencia de despedida: Es mejor escribir sus comandos canalizados agregando un comando a la vez y haciendo que esa parte funcione, luego canalizando en el siguiente comando.