Porque quando você faz o [j] ava, o processo é chamado 'grep [j] ava'. '[j] ava' não combina com o regex '[j] ava' e, portanto, não aparece nos resultados.
Estou usando
ps -ef | grep java | wc -l
para encontrar o número de processos Java em execução a qualquer momento.
O comando acima obviamente conta o comando "ps -ef | grep java" também no resultado.
Para evitar isso, descobri que poderia usar
ps -ef | grep [j]ava | wc -l
e funciona bem. No entanto, gostaria de descobrir o motivo pelo qual é possível ignorar o comando original dos resultados.
Porque quando você faz o [j] ava, o processo é chamado 'grep [j] ava'. '[j] ava' não combina com o regex '[j] ava' e, portanto, não aparece nos resultados.
Quando você faz isso:
ps -ef | grep [j]ava | wc -l
você está usando o padrão [j]ava
que corresponde a qualquer caractere único entre os colchetes (que consiste apenas na letra única j
) seguido imediatamente pelos caracteres ava
. O próprio processo do grep não contém a letra j
seguida imediatamente pelas letras ava
, mas em vez disso, contém um colchete, depois j
, depois um colchete de fechamento e, em seguida, ava
.
Ou seja, o padrão não corresponde a si mesmo.
Esta não é exatamente uma resposta para sua pergunta, mas ...
Outra forma comum de realizar o mesmo é:
ps -ef|grep java|grep -v grep|wc -l
Isso, claro, funciona fazendo um grep invertido no termo grep
Você alterou o nome do processo do grep, para que ele não contenha mais o termo "java"
Para acompanhar outras respostas, esperamos ajudar a esclarecer:
grep java corresponde a qualquer coisa que tenha java dentro dele.
grep java
java
grep [j] ava corresponde explicitamente a "java":
grep [j]ava <- There is no string "java" here so it does not match
java
usa o comando pgrep?
começando com o JDK 1.5, você tem o jps (linux / usr / lib / jvm / java-6-sun / bin / jps). Você pode usá-lo em todo o sistema operacional (linux, windows, solaris)