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

0

Когда используешь 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 флаги, и все они возвращают один и тот же результат. Что не так?

hexacyanide
источник

Ответы:

4

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

ps aux | grep ' processname'

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

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

grep '^.\{65\}processname'

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

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

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

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

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

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

Dennis
источник
поле в смысле awk, например, $2 обозначает второе поле.
Dennis
cmd отображает только голую команду, например, только processnameбез аргументов.
Dennis
1
Ты прав. Я перепутал cmd а также comm, Последний отображает голую команду. cmd а также args являются псевдонимами.
Dennis