Bash正则expression式的问题

我在用

ps -ef | grep java | wc -l 

找出在任何给定时间运行的java进程的数量。

上面的命令显然也会在结果中统计“ps -ef | grep java”命令。

为了避免这个,我发现我可以使用

 ps -ef | grep [j]ava | wc -l 

它工作正常。 不过,我想弄清楚为什么能从结果中跳过原来的命令。

因为当你为[j] ava grep时,这个过程被命名为'grep [j] ava'。 '[j] ava'与正则expression式'[j] ava'不匹配,因此不会显示在结果中。

当你这样做:

 ps -ef | grep [j]ava | wc -l 

你正在使用模式[j]ava ,匹配方括号(只包含单个字母j )之间的任何单个字符,紧接着是字符ava 。 grep进程本身不包含字母j后面紧接着的字母ava ,而是包含方括号,然后是j ,然后是方括号,然后是ava

也就是说,模式本身不匹配。

这不完全是你的问题的答案,但…

完成同样事情的另一个常见方法是:

 ps -ef|grep java|grep -v grep|wc -l 

这当然是通过对grep这个术语本身进行反转来实现的

您已经更改了grep进程的名称,以便它不再包含术语“java”

为了配合其他答案,希望有助于澄清:

grep java匹配任何内部有java的东西。

grep java
java的

grep [j] ava明确地匹配“java”:

grep [j] ava < – 这里没有string“java”,所以它不匹配
java的

使用pgrep命令?

从JDK 1.5开始,你有jps(linux / usr / lib / jvm / java-6-sun / bin / jps)。 你可以在所有的操作系​​统上使用它(linux,windows,solaris)