Ваш ps -cl1
результат выглядит следующим образом:
UID PID PPID F CPU PRI NI SZ RSS WCHAN S ADDR TTY TIME CMD
501 185 172 104 0 31 0 2453272 1728 - S ffffff80145c5ec0 ?? 0:00.00 httpd
501 303 1 80004004 0 31 0 2456440 1656 - Ss ffffff8015131300 ?? 0:11.78 launchd
501 307 303 4004 0 33 0 2453456 7640 - S ffffff8015130a80 ?? 0:46.17 distnoted
501 323 303 40004004 0 33 0 2480640 9156 - S ffffff80145c4dc0 ?? 0:03.29 UserEventAgent
Таким образом, последняя запись в каждой строке ваша команда. Это означает, что вы можете использовать полную силу регулярных выражений, чтобы помочь вам.
$
в регулярном выражении означает конец строки, таким образом, вы можете использовать $
, чтобы указать, что не только выход должен иметь Skype
в нем, он должен заканчиваться Skype
. Это означает, что если у вас есть команда называется Skype Controller
, вы не будете тянуть его вверх:
ps -clx | grep 'Skype$' | awk '{print $2}' | head -1
Вы также можете упростить вещи, используя формат ps -o
просто подтяните столбцы, которые вы хотите:
ps -eo pid,comm | grep 'Skype$' | awk '{print $1}' | head -1
И вы можете устранить head
, используя функцию awk
, чтобы выбрать вашу линию. В awk
, NR
- ваш номер записи. Таким образом, вы можете сделать это:
ps -eo pid,comm | grep 'Skype$' | awk 'NR == 1 {print $1}'
Хека, теперь, когда я думаю об этом, мы могли бы устранить grep
тоже:
ps -eo pid,comm | awk '/Skype$/ {print $1; exit}'
Это использует способность AWK, чтобы использовать регулярные выражения. Если строка содержит регулярное выражение, «Skype $», он напечатает первый столбец, а затем выйдет
Единственная проблема в том, что если бы у вас была команда Foo Skype
, это также заберет ее. Для устранения этого, вам придется сделать немного больше фантазии ног:
ps -eo pid,comm | while read pid command
do
if [[ "$command" = "Skype" ]]
then
echo $pid
break
fi
done
while read
читает две переменные. Фокус в том, что read
использует пробел для разделения переменных, которые он читает. Однако, поскольку есть только две переменные, последняя будет содержать остальную часть всей строки. Таким образом, если команда Skype Controller, вся команда будет помещена в $command
, хотя в ней есть пробел.
Теперь нам не нужно использовать регулярное выражение. Мы можем сравнить команду с равенством.
Это длиннее для ввода, но на самом деле вы используете меньше команд и меньше труб. Помните, что awk
перебирает каждую линию. Все, что вы здесь делаете, делает его более явным. В конце концов, это на самом деле намного эффективнее того, что вы изначально имели.