Назад | Перейти на главную страницу

Вопрос по регулярному выражению в Bash

Я использую

ps -ef | grep java | wc -l

чтобы узнать количество запущенных java-процессов в любой момент времени.

Вышеупомянутая команда, очевидно, учитывает команду "ps -ef | grep java" также в результате.

Чтобы избежать этого, я обнаружил, что могу использовать

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

и он отлично работает. Однако я хотел бы выяснить причину, по которой он может пропустить исходную команду из результатов.

Потому что, когда вы используете grep для [j] ava, процесс называется grep [j] ava ». '[j] ava' не соответствует регулярному выражению '[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

Вы изменили имя процесса grep, так что он больше не содержит термин "java"

Чтобы согласиться с другими ответами, которые, надеюсь, помогут прояснить:

grep java соответствует всему, что содержит java.

grep Ява
Ява

grep [j] ava явно соответствует "java":

grep [j] ava <- Здесь нет строки "java", поэтому она не соответствует
Ява

использовать команду pgrep?

начиная с JDK 1.5, у вас есть jps (linux / usr / lib / jvm / java-6-sun / bin / jps). Вы можете использовать его во всех операционных системах (Linux, Windows, Solaris)