通过参数字符串查找进程

时间:2019-07-03 13:42:48

标签: linux awk sed grep ps

我正在使用psgrepsed来尝试标识由某些特定参数唯一标识的某些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脚本中,可以从其他地方调用。

1 个答案:

答案 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)是否匹配
  • 如果找到,则输出pid($1),命令($2)和相关参数($i

注释:

  • awk无法将cmd "arg1 with spaces"cmd arg1 arg2 arg3区别开来,但这在这里可能没关系
  • 命令中的空格(例如,路径中的目录名称)将导致命令在第一个空格处被截断
  • 命令(或相关参数)中的
  • 逗号将破坏csv输出