【发布时间】:2019-07-03 13:42:48
【问题描述】:
我正在使用ps、grep 和sed 来尝试识别由某些特定参数唯一标识的一些 java 进程,例如-DAppService=DDDABC_456 或 -DAppService=DDDXYZ_456_cazorla。我想返回一个逗号分隔的列表:PID,argument,process
我正在开发 CentOS7。到目前为止,我只完成了大约一半的工作,但正在纠结。
我正在为此拍摄:
1234,-DAppService=DDDABC_456,/usr/java/jdk1.8.0_112/bin/java
2345,-DAppService=DDDABC_456_cazorla,/usr/java/jdk1.8.0_112/bin/java
3456,-DAppService=DDDXYZ_789,/usr/java/jdk1.8.0_112/bin/java
4567,-DAppService=DDDXYZ_789_cazorla,/usr/java/jdk1.8.0_112/bin/java
请注意,参数可能有也可能没有后缀“_cazorla”。
我试过了,但它丢失了参数(参数的数量可能会有所不同,所以我认为我不能继续使用 9 美元、10 美元等):
ps -ef | grep DAppService=DDD[A-Z]*_[0-9]*(?:_[a-z]*)? | grep -v grep | awk '{OFS=","; print $2,$8}'
给我:
1234,/usr/java/jdk1.8.0_112/bin/java
2345,/usr/java/jdk1.8.0_112/bin/java
3456,/usr/java/jdk1.8.0_112/bin/java
4567,/usr/java/jdk1.8.0_112/bin/java
另外,逗号分隔所有 grep 列结果和所有我不想要的参数:
ps -aef | grep DAppService=DDD[A-Z]*_[0-9]*(?:_[a-z]*)? | grep -v grep | sed -e "s/\s\+/,/g"
实际结果太多,无法在此处列出,但例如
user,1234,1,0,Jul03,pts/0,00:03:21,/usr/java/jdk1.8.0_112/bin/java,arg1,arg2,arg3,argn...
user,2345,1,0,Jul03,pts/0,00:03:21,/usr/java/jdk1.8.0_112/bin/java,arg1,arg2,arg3,argn...
user,3456,1,0,Jul03,pts/0,00:03:21,/usr/java/jdk1.8.0_112/bin/java,arg1,arg2,arg3,argn...
user,4567,1,0,Jul03,pts/0,00:03:21,/usr/java/jdk1.8.0_112/bin/java,arg1,arg2,arg3,argn...
我的 sed 知识相当贫乏(awk 也是如此,但也可以作为一种选择)。一旦我对命令感到满意,我想将它们放入我可以从其他地方调用的 bash 脚本中。
【问题讨论】:
-
很高兴你把你的问题放在上下文中,但是帮助 awk 和/或 sed 最有帮助的是显示实际输入到这些命令中的内容 --- 也就是说,包括在您的问题中,
ps -aef | grep DAppService=DDD[A-Z]*_[0-9]*(?:_[a-z]*)? | grep -v grep的输出 -
你的
ps了解-o spec=name吗? -
嗨@jhnc,它出错了“错误:未知的用户定义格式说明符“spec””。我也不确定它是否适用于我客户的盒子。我知道我可以用 ps 得到输出,我知道我可以用 grep/sed/awk 处理输出。
-
嗨@jas 这是给客户的,数据很敏感,所以我不得不混淆一下。替换 DAppService=DDD[A-Z]*_[0-9]*(?:_[a-z]*)?但是,使用 ps -ef 输出中任何进程的任何参数都会生成相同的结果格式。