Quando eu checo a lista de processos e 'saúdo' aqueles que são interessantes para mim, o grep
próprio também é incluído nos resultados. Por exemplo, para listar terminais:
$ 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 eu uso ps aux | grep something | grep -v grep
para me livrar da última entrada ... mas não é elegante :)
Você tem um hack mais elegante para resolver esse problema (além de agrupar todo o comando em um script separado, o que também não é ruim)
ps ux | awk '/name/ && !/awk/ {print $2}'
grep -v grep
parte está fazendo?grep -v grep
excluigrep
dos resultados grep. Se grep for usado em combinação com ps, o processo grep (com argumentos grep) também será mostrado, sobrecarregando seus resultados. grep -v grep é uma forma comum para evitar queRespostas:
A técnica usual é esta:
Isso corresponderá às linhas que contêm
terminal
, o queegrep '[t]erminal'
não! Também funciona em muitos sabores do Unix.fonte
ps aux | grep '[r]oot'
. Alguem sabe por quê?| grep '[t]erminal'
seleciona qualquer linha que contenha a palavra 'terminal' sem colocar a palavra 'terminal' na lista de processos. O que você está tentando alcançar| grep '[r]oot'
e como isso não está funcionando? É provável que haja uma solução melhor.grep '[t]erminal'
corresponderá às linhas que contêmterminal
. A saída deps aux
terá uma linha comgrep '[t]erminal'
(com colchetes), que não contém a sequênciaterminal
(sem o mesmo).Use pgrep . É mais confiável.
fonte
pgrep
não vai funcionar se eu olhar por exemplo, paraps aux | grep 'ssh options'
pgrep -f
?pgrep
apenas corresponde ao padrão com o nome do processo. Para combinar com o comando inteiro, use a-f
bandeira.pgrep
retorna apenas IDs de processo.pgrep -fl
(mas não foi possível ver o cmdline completo sem-f
corresponder ao cmdline completo, detalhes: serverfault.com/a/619788/44183 ). Mas sim, se você precisar de outras informações além de pid, cmdline, precisaráps
. Pode combiná-los:ps -p $(pgrep -f foo)
Esta resposta baseia-se em uma
pgrep
resposta anterior . Também se baseia em outra resposta combinando o uso deps
withpgrep
. Aqui estão alguns exemplos de treinamento pertinentes:O acima pode ser usado como uma função :
Compare com o uso
ps
comgrep
. A linha do cabeçalho útil não é impressa:fonte
-d
opção para especificar um separador; por exemplops -fp$(pgrep -d , getty)
ps uxp `pgrep <process>`
Note quep
deve ser o último parâmetro (ou seja,pux
não vai funcionar)Você pode filtrar no comando ps, por exemplo
(ou pesquise / proc com o find etc.)
fonte
ps -C <command>
corresponderá ao comando exato. Quando usado com osa
oux
opções ele irá informar todos os processos, poisa
ex
lista de processos , além do conjunto de processos correspondidos por outros meios.logind
parasystemd-logind
, ou para combinar argumentos.Mais uma alternativa :
Aqui estão as opções:
fonte
-C
opção já foi sugerida na resposta de @Andreas Frishe postada há mais de um ano e meio ...O uso de colchetes para colocar um caractere no padrão de pesquisa exclui o
grep
processo, pois ele não contém a regex correspondente.fonte
Disclaimer: Eu sou o autor desta ferramenta, mas ...
Eu usaria px :
Exceto por encontrar processos com uma interface de linha de comando sensata, ele também faz muitas outras coisas úteis, mais detalhes na página do projeto .
Funciona no Linux e OS X, facilmente instalado:
fonte
Dependendo do caso de uso final, geralmente você prefere o Awk.
Isso é particularmente verdade quando você tem algo como
onde obviamente a regex pode ser fatorada no script Awk trivialmente:
Mas, realmente, não reinvente isso sozinho.
pgrep
e os amigos já existem há muito tempo e lidam com todo esse espaço problemático muito melhor do que a maioria das reimplementações ad hoc.fonte
Outra opção é editar seu
.bash_profile
(ou outro arquivo em que você mantém os aliases do bash) para criar uma função que recebe 'grep' dos resultados.O
grep -v grep
deve ser o primeiro caso contrário, seu--color=auto
não funcionará por algum motivo.Isso funciona se você estiver usando o bash; se você estiver usando um shell YMMV diferente.
fonte
function grep { command grep -v grep | command grep --color=auto "$@"; }
(observe também a correção do argumento e a citação). No entanto, isso é interrompido porque qualquer nãops
invocação degrep
não funcionará mais (os argumentos são passados incorretamente). De qualquer forma, uma função muito mais útil seria aquela que modifica o regex para que ele não corresponda a si próprio, em vez de filtrargrep
osgrep
resultados separadamente. E, é claro, inventar novas soluções para um problema que foi resolvido adequadamente décadas atrás não é muito produtivo.