Bash 正则表达式问题

Bash 正则表达式问题

我在用

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 语言

相关内容