Cuando reviso la lista de procesos y 'selecciono' aquellos que son interesantes para mí, el grep
mismo también se incluye en los resultados. Por ejemplo, para enumerar terminales:
$ ps aux | grep terminal
user 2064 0.0 0.6 181452 26460 ? Sl Feb13 5:41 gnome-terminal --working-directory=..
user 2979 0.0 0.0 4192 796 pts/3 S+ 11:07 0:00 grep --color=auto terminal
Normalmente uso ps aux | grep something | grep -v grep
para deshacerme de la última entrada ... pero no es elegante :)
¿Tiene un truco más elegante para resolver este problema (aparte de envolver todo el comando en un script separado, que tampoco está mal)
ps ux | awk '/name/ && !/awk/ {print $2}'
grep -v grep
haciendo la parte?grep -v grep
excluyegrep
de resultados grep. Si grep se usa en combinación con ps, entonces también se mostrará el proceso grep (con argumentos grep), abarrotando sus resultados. grep -v grep es una forma común de evitar esoRespuestas:
La técnica habitual es esta:
Esto coincidirá con las líneas que contienen
terminal
, loegrep '[t]erminal'
que no. También funciona en muchos sabores de Unix.fuente
ps aux | grep '[r]oot'
. ¿Alguien sabe por qué?| grep '[t]erminal'
selecciona cualquier línea que contenga la palabra 'terminal' sin poner la palabra 'terminal' en la lista de procesos. ¿Con qué estás tratando de lograr| grep '[r]oot'
y cómo no funciona? Es probable que haya una mejor solución.grep '[t]erminal'
coincidirá con las líneas que contienenterminal
. La salida deps aux
tendrá una línea congrep '[t]erminal'
(con corchetes), que no contiene la cadenaterminal
(sin la misma).Usa pgrep . Es mas confiable.
fuente
pgrep
no funcionaría si busco, por ejemplops aux | grep 'ssh options'
pgrep -f
?pgrep
solo coincide con el patrón con el nombre del proceso. Para hacer coincidir todo el comando, use la-f
bandera.pgrep
solo devuelve ID de proceso.pgrep -fl
(pero no podían ver el cmdline completo sin-f
coincidir con el cmdline completo, detalles: serverfault.com/a/619788/44183 ). Pero sí, si necesita otra información además de pid, cmdline, la necesitaps
. Puede combinarlos:ps -p $(pgrep -f foo)
Esta respuesta se basa en una
pgrep
respuesta previa . También se basa en otra respuesta que combina el uso deps
conpgrep
. Aquí hay algunos ejemplos de capacitación pertinentes:Lo anterior se puede usar como una función :
Comparar con usar
ps
congrep
. La útil fila de encabezado no se imprime:fuente
-d
opción de especificar un separador; Por ejemplops -fp$(pgrep -d , getty)
ps uxp `pgrep <process>`
cuenta quep
debe ser el último parámetro (es decir,pux
no funcionará)Puede filtrar en el comando ps, por ejemplo
(o busque / proc con find, etc.)
fuente
ps -C <command>
coincidirá con el comando exacto. Cuando se utiliza con losa
ox
las opciones que reportará todos los procesos, puesa
, yx
la lista de procesos , además de la serie de procesos coincidentes por otros medios.logind
parasystemd-logind
, o para hacer coincidir argumentos.Una alternativa más :
Aquí las opciones:
fuente
-C
la opción ya fue sugerida en la respuesta de @Andreas Frishe publicada más de un año y medio antes ...El uso de corchetes para rodear un carácter en el patrón de búsqueda excluye el
grep
proceso ya que no contiene la expresión regular coincidente.fuente
Descargo de responsabilidad: soy el autor de esta herramienta, pero ...
Yo usaría px :
Excepto para encontrar procesos con una interfaz de línea de comandos sensible, también hace muchas otras cosas útiles, más detalles en la página del proyecto .
Funciona en Linux y OS X, se instala fácilmente:
fuente
Dependiendo del caso de uso final, a menudo prefieres Awk en su lugar.
Esto es particularmente cierto cuando tienes algo como
donde obviamente la expresión regular se puede factorizar en la secuencia de comandos Awk trivialmente:
Pero en realidad, no reinventes esto tú mismo.
pgrep
y amigos han existido por mucho tiempo y manejan todo este espacio problemático mucho mejor que la mayoría de las reimplementaciones ad hoc.fuente
Otra opción es editar su
.bash_profile
(u otro archivo en el que mantenga los alias bash) para crear una función que elimine los resultados.El
grep -v grep
tiene que ser el primero de lo contrario su--color=auto
voluntad no funciona por alguna razón.Esto funciona si estás usando bash; si está usando un shell diferente YMMV.
fuente
function grep { command grep -v grep | command grep --color=auto "$@"; }
(también ten en cuenta la solución del argumento y la cita). Sin embargo, esto se rompe porque cualquier nops
invocación degrep
ya no funcionará (los argumentos se pasan incorrectamente). De todos modos, una función mucho más útil sería aquella que modifica la expresión regular para que no coincida, en lugar de filtrargrep
losgrep
resultados por separado. Y, por supuesto, inventar nuevas soluciones a un problema que se resolvió adecuadamente hace décadas no es muy productivo.