я использую 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