我正在尝试使用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}}地址。
你能帮忙吗?
答案 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[@]}"