我用來ps -ef | grep catalina | grep -v grep
列印系統上運行的tomcat進程:
kshitiz 7099 1 0 May11 ? 00:02:29 /usr/lib/jvm/jdk1.8.0/bin/java -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:38156 -Dcatalina.base=/home/kshitiz/Documents/workspaces/ggts/.metadata/.plugins/org.eclipse.wst.server.core/tmp1 -Dcatalina.home=/opt/tomcat-7.0.42 -Dwtp.deploy=/home/kshitiz/Documents/workspaces/ggts/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps -Djava.endorsed.dirs=/opt/tomcat-7.0.42/endorsed -Dfile.encoding=UTF-8 -classpath /opt/tomcat-7.0.42/bin/bootstrap.jar:/opt/tomcat-7.0.42/bin/tomcat-juli.jar:/usr/lib/jvm/jdk1.8.0/lib/tools.jar org.apache.catalina.startup.Bootstrap start
然後我用它ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'
來提取進程ID:
7099
但是,當我為整個命令添加別名alias tomcat_id="ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'"
並通過別名使用它時,它會打印整個文本並且awk
似乎不起作用。
type tomcat_id
給出:
tomcat_id is aliased to `ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }''
答案1
別名的一般規則:如果別名對於別名來說太複雜,請改用函數。
tomcat_id () {
ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'
}
您的別名定義的問題是您引用錯誤。定義別名的行是一個 shell 指令,由 shell 解析。由於您使用了雙引號,並且當時可能沒有位置參數(因此$2
擴展為空字串),因此您定義的別名是
ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }'
定義別名的簡單方法是使用單引號進行定義,並避免在別名指令中使用單引號。當我這樣做時,我已經刪除了-F " "
,無論如何這是預設的(有點奇怪,因為它看起來像“一個空格”,但意味著“任何空白序列”)。
alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk "{print \$2}"'
或者您可以使用'\''
在單引號文字中有效地引用單引號。
alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk '\''{print \$2}'\'
但是,正如我上面所寫,使用函數,更清晰。或者更確切地說,使用適合該工作的工具:
alias tomcat_id='pgrep catalina'
或者
alias tomcat_id='pidof catalina'
答案2
Gnouc 的答案是完全有效的(這就是我投票的原因),但我想提供一個替代方案:
alias tomcat_id="ps -ef|awk '\$8 ~ /java/ && /catalina/ {print \$2}'"
這裡的想法是,在進程名稱(欄位 8)中,我們應該能夠找到java
,並且在整個線路上我們應該找到catalina
。
所以我們讓awk
所有的匹配和列印工作都完成。無需打擾grep
;)
所以意思是:
$8 ~ /java/ && /catalina/ {print $2}
是$8
與正規表示式匹配的字段/java/
,並將整行(也可以$0
明確使用)與正規表示式匹配/catalina/
,如果這些事情是真的,則列印字段$2
。記住 Gnouc 的回答中已經說過的話:預設分隔符號已經是空格了。不需要定義這個。
答案3
您必須在指令中轉義美元符號awk
:
alias tomcat_id="ps -ef | grep catalina | grep -v grep | awk '{print \$2}'"
而且您不必使用-F' '
,awk
使用空格作為預設欄位分隔。