Ваш 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
проходит через каждую строку. Все, что вы делаете здесь, делает это более явным. В конце концов, это на самом деле намного эффективнее того, что было у вас изначально.