¿Cuál es el significado del símbolo `|` en el shell?

16

¿Qué significa el |símbolo al sudo ps -ef | grep processnamemando?

También, ¿alguien puede explicar este comando? He usado este comando solo para obtener el PID y matar ese proceso, pero también vi sudo ps -ef | grep processname | grep -v grepy tengo la impresión de que -v grepes como matar el PID generado anteriormente grep. Si es así, ¿cómo funciona?

Aamir
fuente
44
No necesitas sudocorrer ps -ef. También un truco común para evitar el tercer comando es encerrar un carácter del nombre del proceso entre corchetes:ps -ef | grep [p]rocessname
kos
1
@kos Ese comando necesita comillas para funcionar de manera confiable:ps -ef | grep '[p]rocessname'
kasperd
2
@kos Si escribe grep [p]rocessname, le está diciendo al shell que busque un archivo en el directorio actual con el nombre processnamey sustituya el patrón con el nombre de ese archivo. Si no processnameexiste un archivo con nombre , el shell puede pasar el patrón literalmente a grep. Pero eso depende de su configuración. Por lo que su versión se romperá si un archivo llamado processnameexiste o si alguna de las siguientes opciones de shell ha sido habilitado failglob, nullglob, nocaseglob.
kasperd
1
@kasperd Leí mal tu último comentario, sí, tienes razón en todo. No lo consideré.
kos
1
No puedo creer que esto no sea un duplicado.
Mástil

Respuestas:

13
ps -ef | grep processname

Primero se ejecuta sudo ps -efy pasa la salida al segundo comando.

El segundo comando filtra todas las líneas que contienen la palabra "nombre de proceso".

ps -ef | grep processname | grep -v grepenumera todas las líneas que contienen processnamey no contienen grep.

De acuerdo a man grep

-v, --invert-match
              Invert the sense of matching, to select non-matching lines.  (-v
              is specified by POSIX.)

De acuerdo a man ps

ps displays information about a selection of the active processes.

-e     Select all processes.  Identical to -A.

-f     Do full-format listing. This option can be combined with many
          other UNIX-style options to add additional columns.  It also
          causes the command arguments to be printed.  When used with -L,
          the NLWP (number of threads) and LWP (thread ID) columns will be
          added.  See the c option, the format keyword args, and the
          format keyword comm.

Puede combinar parámetros -efsignifica lo mismo que -e -f.

En realidad, ps -ef | grep processnameenumere todas las ocurrencias del proceso llamado processname.

Piloto6
fuente
gracias por la explicacion, que ps -efhace exactamente ??
Aamir
Creo que cuando corremos | grep processNameen la terminal también obtenemos salida de grep, que en sí mismo es un proceso, así que -v mata esta salida
Aamir
Estás en lo correcto.
Pilot6
35

Se llama pipe. Da la salida del primer comando como la entrada al segundo comando.

En su caso significa:
El resultado de sudo ps -efse alimenta como la entrada degrep processname

sudo ps -ef:
Esto enumera todos los procesos en ejecución. Escriba man psel término para más.

grep processname
Entonces, esta lista de procesos se alimenta a grep que solo busca el programa definido por programname.

Ejemplo

Escribiendo sudo ps -ef | grep firefoxen mi terminal vuelve:

parto     6501  3081 30 09:12 ?        01:52:11 /usr/lib/firefox/firefox
parto     8295  3081  4 15:14 ?        00:00:00 /usr/bin/python3 /usr/share/unity-scopes/scope-runner-dbus.py -s web/firefoxbookmarks.scope
parto     8360  8139  0 15:14 pts/24   00:00:00 grep --color=auto firefox
Parto
fuente
ok, qué -v grep, qué hace.
Aamir
buena explicación, pero necesito ayuda sobre cómo -v grep funciona ..
Aamir
Oh, ya veo por qué grep -vse usa. Para filtrar la última línea.
Pilot6
@Aamir Mira mi respuesta. grep -vfiltra las líneas de salida que contienen el patrón.
Pilot6
1
También puede agregar que puede usar varias tuberías. Por ejemplo, echo "foobar" | grep foo | grep bar
Michael
7

Voy a tratar de responder esto con una respuesta práctica directa:

¡La pipa |te permite hacer cosas increíbles en el caparazón! Es el único operador que considero el más útil y poderoso.

¿Qué tal contar archivos en un directorio? sencillo:

ls | wc -l.. redireccionar la salida de lsun wcparámetro ingenioso -lpara líneas

o el recuento de líneas en un archivo?

cat someFile | wc -l

¿Qué pasa si quiero buscar algo? 'grep' puede buscar ocurrencias de cadenas:

cat someFile | grep aRandomStringYouWantToSearchFor

simplemente redirige la salida del comando a la izquierda de la tubería al comando a la derecha de la tubería.

un nivel más: ¿con qué frecuencia ocurre algo en un archivo?

cat someFile | grep aRandomStringYouWantToSearchFor | wc -l

puedes usar el | por casi todo :)

fortune | cowsay

ingrese la descripción de la imagen aquí

Gewure
fuente
2
Sí, las canalizaciones son divertidas, +1, pero cambie los ejemplos: UUOC .
kos
Me gusta: grep -c "aRandomStringYouWantToSearchFor" "someFile";-)
Sadi
De c. pero por simplicidad ... el
propietario de
1
Francamente, muchos de sus ejemplos no necesitan tuberías. ¿Has oído hablar de demoggification? Está utilizando cat y pipe cuando muchos de los comandos tomarán los archivos como parámetros directamente: por ejemplo, cat someFile | grep aRandomStringYouWantToSearchFor debería ser grep aRandomStringYouWantToSearchFor someFile
Capitán Lepton el
chicos ... lo sé si leyó los comentarios, Capitán, habría leído mi respuesta. El tipo que hizo las preguntas no entenderá las aplicaciones REALES de la tubería; ni siquiera sabe qué es grep. Entonces, ¿debo darle este ejemplo? kill $(ps aux | awk '/someString/ { print $2}' | sed -n '1p') no, porque no serviría para nada.
Gewure
4

He usado este comando solo para obtener el PID y matar ese proceso

Otras respuestas ya han respondido a su pregunta principal, pero me gustaría abordar esto también;

En general, matar un proceso a menudo es una exageración y deja los recursos asignados por un proceso en un estado desordenado, a menudo puede terminarlo ;

Además de esto, solo use pkillpara matar / terminar un proceso. pkilladmite especificar un nombre de proceso exacto o una expresión regular:

pkill -x foo # Terminates process foo
pkill ^foo$ # Terminates process foo
pkill -9 -x foo # Kills process foo
pkill -9 ^foo$ # Kills process foo
kos
fuente
1
No lo use a kill -9menos que sepa específicamente que ninguna otra señal funcionará. Véase también iki.fi/era/unix/award.html#kill
tripleee el
@tripleee OP declaró que sin embargo quieren matar el proceso.
kos
Eso es lo que killhace. La especificación -9es una opción adicional adicional y con mayor frecuencia desastrosa.
tripleee
@tripleee Creo que la confusión está surgiendo debido a la terminología; para mí matar = SIGKILL, no SIGTERM.
kos
Para la mayoría de las personas, esperaría que "matar" significara kill, simple y llanamente. Dejando a un lado cualquier terminología, su respuesta no debería aconsejar a las personas que usen la -9opción a menos que pongan una advertencia carnosa.
tripleee