Si estuviera ayudando a alguien a aprender el concepto de tuberías en la línea de comando, ¿qué ejemplo usaría? El ejemplo que realmente surgió fue el siguiente:
cat whatever.txt | less
Siento que ese no es el mejor ejemplo, es decir, porque solo hay un paso. ¿Qué es un uso bueno, pero fundamental |
?
Idealmente, el ejemplo que presentaré utilizará programas que tengan salidas propias que se puedan ejecutar de forma independiente y luego se muestren juntos.
command-line
pipe
Mateo
fuente
fuente
cat
para eso, ya queless whatever.txt
funciona bien.Respuestas:
Voy a guiarte a través de un ejemplo algo complejo, basado en un escenario de la vida real.
Problema
Digamos que el comando
conky
dejó de responder en mi escritorio y quiero eliminarlo manualmente. Sé un poco de Unix, así que sé que lo que tengo que hacer es ejecutar el comandokill <PID>
. Con el fin de recuperar el PID, puedo usarps
otop
o cualquier herramienta de distribución de Unix mi me ha dado. Pero, ¿cómo puedo hacer esto en un solo comando?Responder
DESCARGO DE RESPONSABILIDAD: Este comando solo funciona en ciertos casos. No lo copie / pegue en su terminal y comience a usarlo, podría matar procesos desprevenidos. Más bien aprende a construirlo .
Cómo funciona
1-
ps aux
Este comando generará la lista de procesos en ejecución y alguna información sobre ellos. La información interesante es que generará el PID de cada proceso en su segunda columna. Aquí hay un extracto de la salida del comando en mi caja:
2-
grep conky
Solo estoy interesado en un proceso, por lo que utilizo
grep
para encontrar la entrada correspondiente a mi programaconky
.3-
grep -v grep
Como puede ver en el paso 2, el comando muestra
ps
elgrep conky
proceso en su lista (después de todo, es un proceso en ejecución). Para filtrarlo, puedo ejecutarlogrep -v grep
. La opción-v
le dicegrep
que haga coincidir todas las líneas, excepto las que contienen el patrón.NB: Me encantaría saber cómo hacer los pasos 2 y 3 en una sola
grep
llamada.4-
awk '{print $2}'
Ahora que he aislado mi proceso objetivo. Quiero recuperar su PID. En otras palabras, quiero recuperar la segunda palabra de la salida. Por suerte para mí, la mayoría de los (¿todos?) Unices modernos proporcionarán alguna versión de
awk
un lenguaje de script que hace maravillas con los datos tabulares. Nuestra tarea se vuelve tan fácil comoprint $2
.5-
xargs kill
Tengo el PID Todo lo que necesito es pasárselo
kill
. Para hacer esto, lo usaréxargs
.xargs kill
leerá desde la entrada (en nuestro caso desde la tubería), formará un comando que consta dekill <items>
(<items>
son lo que lea de la entrada) y luego ejecutará el comando creado. En nuestro caso se ejecutarákill 1948
. Misión cumplida.Ultimas palabras
Tenga en cuenta que, dependiendo de la versión de Unix que esté utilizando, ciertos programas pueden comportarse de manera un poco diferente (por ejemplo,
ps
pueden generar el PID en la columna $ 3). Si algo parece incorrecto o diferente, lea la documentación de su proveedor (o mejor, lasman
páginas). También tenga cuidado ya que las tuberías largas pueden ser peligrosas. No haga suposiciones, especialmente cuando use comandos comokill
orm
. Por ejemplo, si hubo otro usuario llamado 'conky' (o 'Aconkyous'), mi comando también puede matar todos sus procesos en ejecución.Lo que digo es tener cuidado, especialmente para tuberías largas. Siempre es mejor construirlo interactivamente como lo hicimos aquí, que hacer suposiciones y sentir lástima más tarde.
fuente
kill $(pgrep conky)
pkill conky
grep
llamada.grep [c]onky
es lo que estás buscandoMi favorito es este:
youtube-dl $1 -q -o - | ffmpeg -i - $2
descarga un video de la url de youtube dada pasada
$1
y lo muestra como el archivo dado por$2
. Observe cómo el archivo se envía silenciosamente-q
a STDOUT-o -
, se canaliza a ffmpeg y se usa como entrada allí-i -
.Especialmente para los novatos de Linux, este podría ser un ejemplo práctico de por qué la línea de comando puede ser útil y hacer las cosas más fáciles que usar herramientas GUI. No estoy seguro de cuánto tiempo tomaría descargar un video de YouTube y convertir su sonido a mp3. La línea anterior puede hacer eso en unos segundos.
fuente
youtube-dl --extract-audio --audio-format mp3 -a -
. Sigue siendo un buen ejemplo, pero hay formas más fáciles de hacerlo. (Llama a ffmpeg internamente.)youtube-dl $1 -q -o - | mplayer -
reproduce directamente el video dentro de mplayer. Uso ese comando de mi computadora portátil para decirle a mi servidor (que está conectado al televisor) que reproduzca videos. Tengo que agregar-display :0.0 -geometry 400x300+1200+200
para que la ventana de mplayer aparezca en la pantalla correcta.El uso general (léase: la forma en que lo uso la mayoría de las veces) es cuando, por alguna razón, tengo que ejecutar algunos datos a través de varias herramientas para llevar a cabo diferentes tareas de procesamiento.
Entonces, diría que el uso de tuberías es como pegamento para ensamblar varios bloques de construcción (las diferentes herramientas de UNIX). Como dijo Ulrich,
sort
yuniq
es una estrofa común.Dependiendo de la audiencia, si desea resaltar este uso de tuberías, podría, por ejemplo, comenzar con: "hey, este programa tiene enlaces a varios PDF interesantes con documentos y notas de clase, pero algunos de ellos se repiten. ¿Puedo? de alguna manera automatizar esto? "
Luego, podría mostrar cómo se
lynx --dump --listonly
obtiene la lista de enlaces, cómogrep
podría filtrar los enlaces que terminan en.pdf
, cómocolrm
osed
podría deshacerse de laslynx
escrituras de números que quedan en cada URL, cómosort
yuniq
podría deshacerse de los duplicados, y finalmente cómowget -i -
puede usarse para recuperar el archivos (solía--wait
ser amable en el servidor, por supuesto).Me temo que este es un ejemplo complejo. Por otro lado, puede ser útil mostrar el poder de las tuberías cuando solo las conecta y hace que la carcasa lo ejecute todo a la vez.
fuente
sort -u
en GNU coreutils .No sé exactamente sobre el bien, pero la canalización
grep
debe ser uno de los usos más comunes, posiblemente seguido porwc -l
. (Sí,grep
tiene el-c
interruptor poco conocido ).Otra estrofa común es
| sort | uniq
, aunque solo sea porqueuniq
requiere que se ordene su entrada.fuente
... | sort -u
si está disponible!No es que lo necesite para este ejemplo, pero:
... invertir el orden de los greps conserva la coloración, pero es MUCHO menos eficiente. presumiblemente en listas grandes, el color no importaría.
Además, esta página web sugiere:
https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep
... pero eso no funcionará si está buscando una sola letra (como el proceso 'X').
fuente
Finalmente puedo compartir este desastre de una línea que hice hace aproximadamente un año y medio ...
Eso...
Apuesto a que esto podría haberse hecho mucho mejor con un solo script de Python.
fuente
Esto es lo primero que me vino a la mente ...
mysqldump
es una aplicación de consola que envía datos, esquemas y opcionalmente procedimientos y funciones a stdout. Por lo general, se redirige a un archivo para respaldo.mysqldump <options> > mydb.dump
Eso le daría un script SQL sin comprimir. Para ahorrar espacio, puede comprimirlo con bzip2.
bzip2 mydb.dump
Alternativamente, puede hacer ambas cosas en un solo paso:
mysqldump <options> | bzip2 > mydb.dump.bz2
En este ejemplo anterior, el stdout de
mysqldump
se canaliza a bzip2 que luego tiene su salida redirigida a un archivo.fuente
bzcat mydb.dump.bz2 | mysql <options>
.Aquí hay un ejemplo que uso en mi trabajo de múltiples tuberías en un comando. Esto usa gawk para buscar el registro de consultas generales de MySQL ($ OFILE) y encontrar los inicios de sesión denegados. Luego clasifica esa lista por nombre, canaliza esa lista a uniq que cuenta las ocurrencias, y luego clasifica por última vez para ordenar la lista contada numéricamente ...
fuente
Las tuberías funcionan mejor con filtros y traductores
De esta forma, los datos pueden fluir de un programa al siguiente en memoria intermedia y en ningún momento todos los datos tienen que estar en la memoria a la vez.
fuente
cat filename | less
es un uso terrible de la tubería ya que solo puedes hacerless filename
Aquí hay un ejemplo de pips que uso todos los días (pero también puede ser un mal ejemplo):
ls -la | more -c
Las respuestas de Scott Hoffman y Njsg son mejores ejemplos.
fuente
¿Qué tal: buscar patrones y mostrar el último patrón que ocurre?
Muestra cómo usar
tail
,sed
ygrep
en un contexto de tubería que se puede construir paso a paso.fuente
ejecute este en cualquier directorio que desee tener un análisis ordenado para el tamaño de la carpeta (luego desplácese hacia abajo con la tecla FIN):
Sortiert nach Ordnergrösse
fuente
Aquí hay un ejemplo que utilicé para configurar la variable DISPLAY cuando xauth no era una opción ...
El primer comando obtiene los datos necesarios, es decir, nombre de host o IP. El segundo comando obtiene solo esos datos (último campo). Finalmente, el último comando elimina el paréntesis de los datos.
fuente
Canalización de comandos que puede usar en cualquier lugar donde sienta que la salida del primer comando se puede alimentar como entrada al siguiente.
Ejemplos.
ejemplo de gato txt | grep {some_line} | awk {some_command}
Es simplemente el concepto de que si siente que la salida del comando que ejecutó puede ingresar otro comando, puede canalizarlos.
fuente