我在用
ps -ef | grep java | wc -l
查找在任何给定时间运行的 Java 进程的数量。
上述命令显然将“ps -ef | grep java”命令也算在结果中。
为了避免这种情况,我发现我可以使用
ps -ef | grep [j]ava | wc -l
并且运行正常。但是,我想弄清楚为什么它能够从结果中跳过原始命令。
答案1
因为当您 grep [j] ava 时,该过程被命名为“grep [j] ava”。'[j] ava' 与正则表达式 '[j] ava' 不匹配,因此不会显示在结果中。
答案2
当你这样做时:
ps -ef | grep [j]ava | wc -l
[j]ava
您正在使用与方括号之间的任何单个字符(仅由单个字母组成)匹配的模式,该j
模式后紧接着字符ava
。 grep 进程本身不包含j
紧接着字母的字母ava
,而是包含一个方括号,然后是j
,然后是右方括号,然后是ava
。
也就是说,模式本身不匹配。
答案3
这不完全是对你问题的回答,但是......
完成同样的事情的另一种常见方法是:
ps -ef|grep java|grep -v grep|wc -l
这当然可以通过对术语 grep 本身进行反向 grep 来实现
答案4
与其他答案一起希望有助于澄清:
grep java 匹配其中包含 java 的任何内容。
grepJava 语言
Java 语言
grep [j]ava 明确匹配“java”:
grep [j]ava <- 这里没有字符串“java”,所以不匹配
Java 语言