我用来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
使用空格作为默认字段分隔。