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 psproceso!
¿Cómo puedo evitar que grep aparezca en los resultados?

ps aux |grepconpgrep(opgrep -f).ps aux, espero). Entonces, la pregunta es cómo evitargrep fnordque 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
greplo 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]nordno 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 llamadofnorden el directorio actual.pspuede ser un viejo truco, pero no es confiable. Usarpgrepsi está disponible.fnordy 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
pgrepcomando. 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
-fopción sea más parecidaps | grep.pgrep -fse verá más comops -f | grep.-largumento 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
pgrepo encontrar otra;)No es la solución más elegante, pero podría hacer esto:
$ ps aux | grep fnord | grep -v grepfuente
grepen tu frase. No mostrará ese proceso. Por ejemplo, suponga quefoo_grep_bar.txtelnanocomando 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.txtacuerdo con esta respuesta, esto no funcionará:$ ps aux | grep nano | grep -v grepporque hay una palabra clave en su nombre de archivo.grep fnordno solo,grepes 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 usarlogrepen 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
fnordprocesos, puede usar la-Copció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
pslado de la tubería. Todo lo que tenemos que hacer es decirlepsque excluyagrepprocesos del resultado:-C grepselecciona todos los procesos grep y-Nniega 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
pspero-CPOSIX 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:
pssalida detallada (en unalocalvariable para que desaparezca cuando la función regrese)$PS_OUTPUTy eliminar todo después del primer avance de línea (regex equiv:)s/\n.*$//msg. Esto nos impide agarrar el títulopssalida con todo excepto la primera línea (regex equiv:)s/^.*\n//my grep su contenido con-imayú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 grepsolución, filtrando todos losgrepprocesos 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
pscomando local .Es posible que desee combinar esto con una
grepsalida 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
pssalida 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
psfalla sipgrepdevuelve 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-agentnombre de usuario sin mostrar el PID delgrepproceso en sí:Si desea, por ejemplo, matar
ssh-agentpara 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
.bashrcestilo:fuente
grepuso en otros casos. Tratarecho I love grep | grep love.