你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
而且,您可以通過簡單地使用awk
爲您選擇線路的功能來消除head
。在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控制器,則整個命令將被放入$command
,即使其中有空間。
現在,我們不必使用正則表達式。我們可以比較命令與平等。
輸入的時間較長,但實際上使用的命令較少,管道較少。記住awk
正在循環每一行。你在這裏做的只是讓它更加明確。最後,這實際上比你原來的效率高得多。