awk命令获取进程名称

时间:2017-06-27 15:04:43

标签: bash tomcat awk

我正在尝试使用shell脚本中的awk命令获取进程名称,如下所示

伪代码

app=`ssh tomcat@server ps -ef | grep $procid | grep -v "grep" | awk -F ' ' '{print $NF}' | sed 's/ //' | sed 's/\.jar//'`  

示例日志文件如下

tomcat    4818     1  1 Jun15 ?        02:46:09  /usr/local/integration-banana.jar --server.port=9023
tomcat   10283     1  0  2016 ?        1-20:19:20 /usr/local/integration-mango.jar
tomcat   10655     1  0  2016 ?        1-21:29:32 /usr/local/integration-grapes.jar
tomcat    4062     1  1 Mar16 ?        1-01:47:37 /usr/local/integration-kiwi.jar --server.port=9012

所需的输出

banana
mango
grapes
kiwi

但是在这种情况下我得到了

--server.port
mango
grapes
--server.port

我的理解是在NF命令中使用awk打印最后一列,但是从这个日志文件中我还需要使用NF来获取进程名称而没有--server.port 1}}地址。 你能帮忙吗?

3 个答案:

答案 0 :(得分:0)

awk '{ for (i=1;i<=NF;i++) { if ( $i ~ /\// ) { split($i,arry,".");split(arry[1],arry1,"-");print arry1[2] }  } }'

上面的awk解决方案应该适用于ps的输出。我们检查每条记录的文件路径(与/匹配的模式)。然后我们首先使用“。”将字符串拆分为一个名为arry的数组。然后使用此数组使用“ - ”进一步拆分。这为我们提供了所需文件名的部分。

答案 1 :(得分:0)

如果您看到某些代码,例如ps -ef|grep|grep|sed|sed|awk...... 90%,那么您的目标就会出错。

您应该阅读ps的手册页,并尝试让ps为您提供所需的信息,例如它-p pidlist仅列出给定pid的流程。有很多输出格式选项。

对于您的特定问题,您正在搜索java进程,好吧,jps附带jdk工具。只需jps<enter>在服务器上试一试,看看你得到了什么。做一个man jps,并查看选项,这将是获取java进程的最简单的方法,如果你想切断.jar,你可以管道到{{1}很明显,你知道该怎么做。

再次,不要sed

答案 2 :(得分:0)

array=( $(ssh tomcat@server ps -ef | awk '{print $8}' )
array=( ${array[@]##*-} )
array=( ${array[@]%\.*} )
echo "${array[@]}"