Cuando busco algún proceso que no existe, por ejemplo
$ ps aux | grep fnord
wayne 15745 0.0 0.0 13580 928 pts/6 S+ 03:58 0:00 grep fnord
Obviamente no me importa el grep, ¡eso tiene tanto sentido como buscar el ps
proceso!
¿Cómo puedo evitar que grep aparezca en los resultados?
ps aux |grep
conpgrep
(opgrep -f
).ps aux
, espero). Entonces, la pregunta es cómo evitargrep fnord
que aparezca como un proceso en ejecución porque obviamente no estoy interesado en ese .Respuestas:
Resulta que hay una solución encontrada en llavero .
Al poner los corchetes alrededor de la letra y las comillas alrededor de la cadena, busca la expresión regular, que dice: "Encuentra el carácter 'f' seguido de 'nord'".
Pero dado que coloca los corchetes en el patrón 'f' ahora va seguido de ']', por
grep
lo que no aparecerá en la lista de resultados. Neato!fuente
grep [f]nord
. Sin embargo, esa línea no entrará a través del filtro grep, porque la cadena[f]nord
no coincide con la expresión regular[f]nord
.ps aux | grep fnord | grep -v grep
... lo que parece haber sido sugerido por algunas personas ... jajaja[
incluso en bash. Pruébelo con un archivo llamadofnord
en el directorio actual.ps
puede ser un viejo truco, pero no es confiable. Usarpgrep
si está disponible.fnord
y un programa llamadosafnorde
. O hay un usuario llamadobfnord
, y terminas matando todos sus procesos. Etc.Otra opción que uso (especialmente para ver si se está ejecutando un proceso) es el
pgrep
comando. Esto buscará un proceso de coincidencia, pero no mostrará una línea grep para la búsqueda. Me gusta porque es una forma rápida de búsqueda, sin regexing ni escapar de nada.fuente
-f
opción sea más parecidaps | grep
.pgrep -f
se verá más comops -f | grep
.-l
argumento para hacer que muestre el comando que se está haciendo coincidir.ps | grep '[f]nord'
es inteligente y venerable, pero pgrep tiene razón .ps $(pgrep cmd) ...
si a `pgrep le faltan opciones (aunque no funcionará para un conjunto de comandos vacío).La solución ideal es la presentada por BriGuy
Pero si no desea hacer eso, puede excluir todas las líneas que coinciden con grep con:
fuente
pgrep
o encontrar otra;)No es la solución más elegante, pero podría hacer esto:
$ ps aux | grep fnord | grep -v grep
fuente
grep
en tu frase. No mostrará ese proceso. Por ejemplo, suponga quefoo_grep_bar.txt
elnano
comando está editando un archivo llamado . Entonces, hay un proceso en ejecución: deroot 14908 0.0 0.0 110012 1692 pts / 3 S + Oct31 0:00 nano foo_grep_bar.txt
acuerdo con esta respuesta, esto no funcionará:$ ps aux | grep nano | grep -v grep
porque hay una palabra clave en su nombre de archivo.grep fnord
no solo,grep
es decir$ ps aux | grep fnord | grep -v "grep fnord"
En zsh,
grep fnord =(ps aux)
.La idea es, primero ejecutar
ps aux
, poner el resultado en un archivo, luego usarlogrep
en ese archivo. Solo que no tenemos un archivo, ya que usamos la "sustitución de proceso" de zsh.Para ilustrar, intente
El resultado debería ser el mismo.
Comentario general sobre algunas de las otras respuestas. Algunos son muy complicados y / o largos de escribir. No es solo una cuestión de tener razón, también debe ser utilizable. Pero eso no significa que algunas de esas soluciones sean malas; solo, deben estar envueltos dentro de una mini interfaz de usuario para que sean utilizables.
fuente
<(command)
.grep grep =(ps aux)
No muestra ninguna línea.print -l ${(M)${(f)¨$(ps aux)¨}:#*fnord*}
fuente
| grep $(echo fnord)
fue suficiente? ¿también le pide a sed que busque y reemplace cada carácter en "fnord" por su propio valor? ^^ felicidades. Apuesto a que puedo hacer uno aún más largo, pero probablemente no será tan divertido ^^ps aux | grep '[^]]fnord'
evitaría eso gimnástico.Buscando procesos
Si solo está buscando
fnord
procesos, puede usar la-C
opción para seleccionar por nombre de comando:Esto se puede mezclar con las opciones de formato de estilo BSD y POSIX a su gusto. Consulte la página de manual de ps para obtener una lista completa.
¿Buscando algo más?
Si necesita algo más avanzado que una búsqueda exacta de un nombre de comando, ¡no pierda la esperanza! Esto todavía se puede hacer en el
ps
lado de la tubería. Todo lo que tenemos que hacer es decirleps
que excluyagrep
procesos del resultado:-C grep
selecciona todos los procesos grep y-N
niega la selección. Esto se puede usar para buscar argumentos de comando, parte del nombre de un comando o expresiones regulares más complejas.fuente
ps
pero-C
POSIX no lo especifica y tiene un significado completamente diferente en BSDMi respuesta es una variación de la respuesta típica para buscar "foobar" en una lista 'ps'. El argumento de "-A" "ps" es más portátil que "aux", creo, pero este cambio es irrelevante para la respuesta. La respuesta típica se ve así:
En cambio, uso este patrón:
La principal ventaja es que es más fácil escribir scripts basados en estos patrones porque simplemente concatena una cadena estática "[^]]" con cualquier patrón que esté buscando. No necesita quitar la primera letra de la cadena, luego insertarla entre las llaves cuadradas y luego concatenarla nuevamente. Al hacer scripts en shell, es más fácil simplemente pegar "[^]]" delante del patrón que estaba buscando. Cortar cadenas en Bash es algo feo, por lo que mi variación lo evita. Esta variación dice mostrar las líneas donde el patrón coincide SIN un corchete derecho]. Dado que el patrón de búsqueda para excluir un corchete en realidad agrega el corchete al patrón, nunca coincidirá.
Entonces podría escribir un comando portátil 'psgrep' de la siguiente manera. Aquí, considero algunas diferencias entre Linux, OS X BSD y otros. Esto agrega los encabezados de columna de 'ps', proporciona un formato 'ps' más personalizado que se adapta mejor a mis necesidades, y muestra procesos que enumeran más, más ancho para que ninguno de los argumentos de la línea de comandos se pierda. Bueno, la mayoría no se pierden. Java es Java, a menudo hace las cosas de la peor manera posible, por lo que algunos servicios de Java superarán la longitud máxima permitida de argumentos de los que la tabla de procesos realizará un seguimiento. Creo que esto es 1024 caracteres. La longitud de comando único permitida para iniciar un proceso es mucho más larga, pero la tabla de proceso del núcleo no se molesta en realizar un seguimiento de nada de más de 1K de longitud. Una vez que se inicia el comando, el nombre del comando y la lista de argumentos no
fuente
La forma más simple de hacer esto sin agnóstico sería almacenarlo primero en una variable:
Llamada: la
grep fnord =(ps aux)
respuesta de @ EmanuelBerg es, con mucho, la más elegante, aunque requierezsh
. Lo tuve brevemente en mis archivos rc, pero bash se queja de esa sintaxis incluso a pesar de una condicional que debería evitar su evaluación.De mis archivos rc, tengo una versión que no distingue entre mayúsculas y minúsculas que toma los argumentos de grep:
Paseo de código, una viñeta por línea de código:
ps
salida detallada (en unalocal
variable para que desaparezca cuando la función regrese)$PS_OUTPUT
y eliminar todo después del primer avance de línea (regex equiv:)s/\n.*$//msg
. Esto nos impide agarrar el títulops
salida con todo excepto la primera línea (regex equiv:)s/^.*\n//m
y grep su contenido con-i
mayúsculas y minúsculas y con todos los argumentos entregados a esta función (en el caso de no argumentos^
, que coincide con el inicio de cualquier línea para que coincida todo)fuente
Aquí hay una versión extendida de la
grep -v grep
solución, filtrando todos losgrep
procesos que no se han estado ejecutando por más de un segundo, lo cual es una mejora sobre "simplemente descartar todas las ocurrencias degrep
".respectivamente
Esto puede no ser portátil y depende del formato de salida real de su
ps
comando local .Es posible que desee combinar esto con una
grep
salida en color para mayor comodidad:fuente
Tal vez es hora de usar una secuencia real esta vez. El uso de tuberías lo hace paralelo.
Feo porque habrá un archivo
f
, pero no es mi culpa que no haya una sintaxis para procesos secuenciales en los que aún desee utilizar la salida de un proceso ejecutado anteriormente.Sugerencia para la sintaxis de un operador secuencial:
fuente
ps
salida antes que yogrep
, estoy usando más memoria (o disco) por más tiempo.El comando pgrep, como han dicho otros, devolverá el PID (ID de proceso) de los procesos en función del nombre y otros atributos. Por ejemplo,
le dará los PID, delimitados por una coma (,) de todos los procesos cuyo nombre coincide con el que ejecuta el usuario
<username>
. Puede usar el modificador -x antes para devolver solo coincidencias exactas.Si desea obtener más información sobre estos procesos (como implica la ejecución de las opciones auxiliares desde ps), puede usar la opción -p con ps, que coincide en función del PID. Así por ejemplo,
proporcionará información detallada de todos los PID coincidentes con el comando pgrep.
fuente
ps
falla sipgrep
devuelve un conjunto vacío. Tengo una respuesta que se basa en la suya y trata de abordar este problema.Aquí hay un ejemplo simple para encontrar el PID del
ssh-agent
nombre de usuario sin mostrar el PID delgrep
proceso en sí:Si desea, por ejemplo, matar
ssh-agent
para el usuario actual, puede usar el siguiente comando:Para crear un práctico alias, agregue a su archivo ~ / .bashrc o ~ / .zshrc el siguiente código:
Y para usar el alias aquí hay ejemplos para obligar a todos a aprender expresiones regulares:
PD: solo he probado estos comandos en Ubuntu y Gentoo.
fuente
"${USER}.* /usr/bin/ssh-agent"
. Funciona porque dijiste[ ]
; es decir, solo está utilizando el mecanismo de la respuesta aceptada. Es lo mismo que biengrep "[s]sh-agent"
.Usar la opción -x (coincidencia exacta) funcionó para mí. Lo combiné con -f (línea de comando completa), para poder hacer coincidir mi proceso precisamente con:
fuente
Puedes hacerlo fácilmente, solo definiendo un ALIAS en tu
.bashrc
estilo:fuente
grep
uso en otros casos. Tratarecho I love grep | grep love
.