Bash: регулярное выражение Grep не работает

Bash: регулярное выражение Grep не работает

При использовании grepтаким образом:

ps aux | grep 'processname' | awk '{print $2}'

Возвращается процессов PIDsс processname. При использовании этого:

ps aux | grep '^processname' | awk '{print $2}'

Я пытаюсь получить процессы, командная строка которых начинается с processname, но это не работает.

Примеры запущенных процессов:

processname
other_processname

Я хотел бы получить PIDпервый вариант, так как processnameэто начало команды.

Я также пробовал использовать -E, -e, -wфлаги, и все они возвращают тот же результат. Что не так?

решение1

^отмечает начало строки, а не поля.

ps aux | grep ' processname'

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

Поскольку ширина других столбцов фиксирована, вы также можете использовать

grep '^.\{65\}processname'

Здесь ^.\{65\}ровно 65 символов от начала строки. Точное число может отличаться в вашей системе.

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

ps aux | awk '{ if ($11 == "processname") print $2 }'

Вы также можете переформатировать вывод ps, чтобы упростить grepping:

ps ax -o pid,args | grep '^[^ ]\+ processname'

Переключатель -o pid,argsзаставляет ps отображать только PID и команду с аргументами. Выражение ^[^ ]\+соответствует всем символам от начала строки до первого пробела.

Связанный контент