我正在使用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脚本中,可以从其他地方调用。
答案 0 :(得分:0)
ps -eo pid=,args= |\
awk '
{
for (i=3; i<=NF; i++)
if ($i ~ regex) {
print $1, $i, $2
next
}
}
' OFS=, regex='awk re to match arg'
ps
,仅输出pid和命令行awk
指定一个正则表达式,并让它检查每个自变量(字段3至NF)是否匹配$1
),命令($2
)和相关参数($i
)注释:
cmd "arg1 with spaces"
与cmd arg1 arg2 arg3
区别开来,但这在这里可能没关系