Your 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
因此,每行的最后一个条目就是您的命令。这意味着您可以使用正则表达式的全部功能来帮助您。
The $
正则表达式中表示字符串的结尾,因此,您可以使用$
指定输出不仅必须具有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
too:
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
The while read
正在读取两个变量。诀窍是read
使用空格来划分读入的变量。但是,由于只有两个变量,最后一个变量将包含整行的其余部分。因此如果命令是Skype控制器,整个命令将被放入$command
即使里面有一个空格。
现在,我们不必使用正则表达式。我们可以将该命令与等式进行比较。
输入的时间较长,但实际上使用的命令和管道较少。记住awk
循环遍历每一行。您在这里所做的只是使其更加明确。最后,这实际上比你原来的效率要高得多。