Quando procuro algum processo que não existe, por exemplo,
$ ps aux | grep fnord
wayne 15745 0.0 0.0 13580 928 pts/6 S+ 03:58 0:00 grep fnord
Obviamente, eu não ligo para grep - isso faz tanto sentido quanto procurar pelo ps
processo!
Como posso impedir que o grep apareça nos resultados?
ps aux |grep
porpgrep
(oupgrep -f
).ps aux
, espero). Portanto, a questão é como impedirgrep fnord
que apareça como um processo em execução, porque obviamente não estou interessado nisso .Respostas:
Acontece que há uma solução encontrada no chaveiro .
Ao colocar os colchetes em volta da letra e das aspas, você procura a regex, que diz: "Encontre o caractere 'f' seguido de 'nord'".
Mas como você coloca os colchetes no padrão 'f' agora é seguido por ']',
grep
não será exibido na lista de resultados. Neato!fonte
grep [f]nord
. No entanto, essa linha não entra no filtro grep, porque a string[f]nord
não corresponde à expressão regular[f]nord
.ps aux | grep fnord | grep -v grep
... que parece já ter sido sugerido por algumas pessoas ... lol[
even in bash. Experimente com um arquivo chamadofnord
no diretório atual.ps
pode ser um truque antigo, mas não é confiável. Usepgrep
se disponível.fnord
e um programa chamadosafnorde
. Ou existe um usuário chamadobfnord
, e você acaba matando todos os processos dele. Etc.Outra opção que eu uso (especialmente apenas para verificar se um processo está em execução) é o
pgrep
comando Isso procurará um processo de correspondência, mas não listará uma linha grep para a pesquisa. Gosto porque é uma maneira rápida de pesquisar, sem regexar ou escapar de nada.fonte
-f
opção seja mais parecidaps | grep
.pgrep -f
será mais parecidops -f | grep
.-l
argumento para mostrar o comando que está sendo correspondido.ps | grep '[f]nord'
é inteligente e venerável, mas o pgrep está certo .ps $(pgrep cmd) ...
se o `pgrep estiver faltando opções (embora não funcione para um conjunto vazio de comandos).A solução ideal é a apresentada pela BriGuy
Mas se você não quiser fazer isso, poderá excluir todas as linhas que correspondem ao grep com:
fonte
pgrep
ou encontrar outro;)Não é a solução mais elegante, mas você pode fazer isso:
$ ps aux | grep fnord | grep -v grep
fonte
grep
em sua frase. Não mostrará esse processo. Por exemplo, suponha que um arquivo chamadofoo_grep_bar.txt
esteja sendo editado pelonano
comando. Portanto, há um processo em execução: deroot 14908 0.0 0.0 110012 1692 pts / 3 S + Oct31 0:00 nano foo_grep_bar.txt
acordo com esta resposta, isso não funcionará:$ ps aux | grep nano | grep -v grep
porque há uma palavra grep no seu nome de arquivo.grep fnord
não apenasgrep
isto é, #$ ps aux | grep fnord | grep -v "grep fnord"
No zsh
grep fnord =(ps aux)
,.A idéia é, primeiro executar
ps aux
, colocar o resultado em um arquivo e depois uságrep
-lo. Apenas não temos um arquivo, pois usamos a "substituição de processo" do zsh.Para ilustrar, tente
O resultado deve ser o mesmo.
Comentário geral sobre algumas das outras respostas. Alguns são muito complicados e / ou demoram para digitar. Não é apenas uma questão de estar certa, deve ser utilizável também. Mas isso não significa que algumas dessas soluções sejam ruins; somente, eles devem ser agrupados em uma mini-interface do usuário para torná-los utilizáveis.
fonte
<(command)
.grep grep =(ps aux)
não mostra nenhuma linha.print -l ${(M)${(f)¨$(ps aux)¨}:#*fnord*}
fonte
| grep $(echo fnord)
não foi suficiente? você também pede ao sed para pesquisar e substituir cada caractere em "fnord" por seu próprio valor? ^^ parabéns. Aposto que posso fazer até mais longo, mas provavelmente não será tão engraçado ^^ps aux | grep '[^]]fnord'
evitaria essa ginástica.Procurando por Processos
Se você está apenas procurando
fnord
processos, pode usar a-C
opção para selecionar pelo nome do comando:Isso pode ser combinado com as opções de formato no estilo BSD e POSIX ao seu gosto. Veja a página de manual do ps para uma lista completa.
Procurando algo mais?
Se você precisar de algo mais avançado do que uma busca exata por um nome de comando, não perca a esperança! Isso ainda pode ser feito na
ps
lateral do tubo. Tudo o que precisamos fazer é dizerps
para excluirgrep
processos do resultado:-C grep
seleciona todos os processos grep e-N
nega a seleção. Isso pode ser usado para procurar argumentos de comando, parte de um nome de comando ou expressões regulares mais complexas.fonte
ps
, mas-C
não é especificado por POSIX e tem aa significado completamente diferente em BSDMinha resposta é uma variação da resposta típica para procurar "foobar" em uma lista de 'ps'. O argumento de "-A" "ps" é mais portátil que "aux", acredito, mas essa mudança é irrelevante para a resposta. A resposta típica é assim:
Em vez disso, uso este padrão:
A principal vantagem é que é mais fácil escrever scripts com base nesses padrões, porque você simplesmente concatena uma sequência estática "[^]]" com qualquer padrão que esteja procurando. Você não precisa retirar a primeira letra da string, depois inseri-la entre os colchetes e concatenar isso novamente. Ao criar scripts no shell, é mais fácil colocar "[^]]" na frente do padrão que você estava procurando. Fatiar cordas no Bash é uma coisa feia, então minha variação evita isso. Essa variação indica as linhas em que o padrão corresponde SEM um colchete quadrado direito]. Como o padrão de pesquisa para excluir um colchete, na verdade, adiciona o colchete ao padrão, ele nunca será compatível.
Então você pode escrever um comando portátil 'psgrep' da seguinte maneira. Aqui, considero algumas diferenças entre Linux, OS X BSD e outros. Isso adiciona os cabeçalhos das colunas de 'ps', fornece um formato 'ps' mais personalizado, adequado às minhas necessidades, e exibe processos listando extra, extra largo, para que nenhum dos argumentos da linha de comando seja esquecido. Bem, a maioria não faz falta. Java sendo Java, geralmente faz as coisas da pior maneira possível; portanto, alguns serviços java executam o comprimento máximo permitido de argumentos que a tabela de processos acompanhará. Acredito que sejam 1024 caracteres. O tamanho do comando único que é permitido iniciar um processo é muito mais longo, mas a tabela de processos do kernel não se preocupa em rastrear algo com mais de 1K de comprimento. Depois que o comando é iniciado, a lista de nome e argumento do comando não é mais '
fonte
A maneira mais simples, independente do shell, de fazer isso seria armazená-lo em uma variável primeiro:
Texto explicativo: A
grep fnord =(ps aux)
resposta de @ EmanuelBerg é de longe a mais elegante, embora exijazsh
. Eu o tive brevemente nos meus arquivos rc, mas o bash reclama dessa sintaxe, apesar de um condicional que deve impedir sua avaliação.Nos meus arquivos rc, tenho uma versão que não diferencia maiúsculas de minúsculas que aceita os argumentos do grep:
Caminhada pelo código, um marcador por linha de código:
ps
saída detalhada (em umalocal
variável para que ela desapareça quando a função retornar)$PS_OUTPUT
e remova tudo após o primeiro avanço de linha (regex equiv:)s/\n.*$//msg
. Isso nos impede de cumprimentar o títulops
saída com tudo, exceto a primeira linha (regex equivs/^.*\n//m
:), e grep seu conteúdo com-i
for case-insensitive e com todos os argumentos entregues a essa função (no caso de sem argumentos^
, que corresponde ao início de qualquer linha para corresponder) tudo)fonte
Talvez seja hora de usar uma sequência real desta vez. O uso de tubos torna paralelo.
Feio porque haverá um arquivo
f
, mas não é minha culpa que não haja sintaxe para processos sequenciais em que você ainda deseja usar a saída de um processo executado anteriormente.Sugestão para a sintaxe de um operador seqüencial:
fonte
ps
saída antes degrep
usar mais memória (ou disco) por mais tempo.O comando pgrep, como outros já declararam, retornará o PID (ID do processo) dos processos com base no nome e outros atributos. Por exemplo,
fornecerá os PIDs, delimitados por vírgula (,) de todos os processos cujo nome corresponde à execução do usuário
<username>
. Você pode usar a opção -x antes para retornar apenas correspondências exatas.Se você deseja obter mais informações sobre esses processos (como implica a execução das opções aux do ps), você pode usar a opção -p com ps, que corresponde com base no PID. Então, por exemplo,
fornecerá informações detalhadas de todos os PIDs correspondentes ao comando pgrep.
fonte
ps
falhará sepgrep
retornar um conjunto vazio. Tenho uma resposta que se baseia na sua e tenta resolver esse problema.Aqui está um exemplo simples para encontrar o PID do
ssh-agent
nome de usuário sem mostrar o PID dogrep
próprio processo:Se você deseja, por exemplo, matar
ssh-agent
o usuário atual, pode usar o seguinte comando:Para criar um alias útil, adicione ao seu arquivo ~ / .bashrc ou ~ / .zshrc o seguinte código:
E para usar o alias, aqui estão exemplos para forçar todos a aprender expressões regulares:
PS: Apenas testei esses comandos no Ubuntu e Gentoo.
fonte
"${USER}.* /usr/bin/ssh-agent"
. Funciona porque você disse[ ]
; ou seja, você está apenas usando o mecanismo da resposta aceita. Você pode muito bemgrep "[s]sh-agent"
.Você pode fazer isso facilmente, apenas definindo um ALIAS
.bashrc
como este:fonte
grep
uso em outros casos. Tenteecho I love grep | grep love
.Usar a opção -x (correspondência exata) funcionou para mim. Combinei com -f (linha de comando completa), para que eu pudesse combinar meu processo precisamente com:
fonte