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

pgrep искать несколько слов

я использую pgrep найти запущенные процессы, имеющие несколько слов

> pgrep -f "otp"
2345
2343

Идентифицировано более одного процесса. В командной строке есть еще одно слово, которое поможет мне сосредоточиться на точном процессе. Итак, я хочу найти два термина, и оба должны быть там. К сожалению, я вижу только примеры и помощь для таких комбинаций ИЛИ:

> pgrep -f "otp|place1"
2345
2343
3632

Это не работает, потому что это условие ИЛИ. Мне нужно условие И в моем шаблоне поиска.

Ссылка pgrep: https://linux.die.net/man/1/pgrep

шаблон: указывает расширенное регулярное выражение для сопоставления с именами процессов или командными строками.

Как мне использовать pgrep для поиска двух слов в комбинации И вместо ИЛИ?

Я отказался от pgrep давным-давно. Всегда казалось, что оно должно быть более полезным, чем то, чем оно стало в итоге.

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

egrep позволяет фильтровать с помощью расширенных регулярных выражений, что становится важным, когда вам нужен только «один ответ». grep -E должен делать то же самое, но я привык использовать egrep потому что мне нужно было решение, которое работало бы с разными вариантами * nix.

В -e флаг говорит ps для отображения всех процессов (запускается с разрешения исполняющего пользователя, то есть: не все процессы отображаются, если вы не являетесь пользователем root). В-f флаг говорит ps выпустить "полноформатный" листинг, который вам может понадобиться | less при просмотре, так как более длинные аргументы CLI могут прокручиваться с правой стороны терминала и не переноситься. Надеюсь, поможет.

Найдите подходящие процессы agetty:

# ps -ef | egrep agetty
root      1386     1  0 Sep19 ttyS0    00:00:00 /sbin/agetty --keep-baud 115200 38400 9600 ttyS0 vt220
root      1388     1  0 Sep19 tty1     00:00:00 /sbin/agetty --noclear tty1 linux
root     28332  4228  0 11:23 pts/2    00:00:00 grep -E agetty

Найти соответствие процесса agetty которые также имеют baud в них:

# ps -ef | egrep 'agetty.*baud'
root      1386     1  0 Sep19 ttyS0    00:00:00 /sbin/agetty --keep-baud 115200 38400 9600 ttyS0 vt220
root     28347  4228  0 11:23 pts/2    00:00:00 grep -E agetty.*baud

Не возвращай мой grep обработать. Не знаю, как это работает, но избавляет от необходимости | grep -v 'grep' по результатам. Может быть, кто-нибудь сможет это объяснить:

# ps -ef | egrep 'agetty.*b[a]ud'
root      1386     1  0 Sep19 ttyS0    00:00:00 /sbin/agetty --keep-baud 115200 38400 9600 ttyS0 vt220

egrep с условием ИЛИ

# ps -ef | egrep '(ag[e]tty|ac[p]id)'
root       944     1  0 Sep19 ?        00:00:00 /usr/sbin/acpid
root      1386     1  0 Sep19 ttyS0    00:00:00 /sbin/agetty --keep-baud 115200 38400 9600 ttyS0 vt220
root      1388     1  0 Sep19 tty1     00:00:00 /sbin/agetty --noclear tty1 linux
root     28395  4228  0 11:28 pts/2    00:00:00 grep -E (agetty|acpid)

Нашел один способ, с условием, что они должны быть по порядку: разделите слова .*

> pgrep -f "otp.*place1"
2345