При использовании 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 и команду с аргументами. Выражение ^[^ ]\+
соответствует всем символам от начала строки до первого пробела.