开发者社区> 问答> 正文

通过参数字符串查找过程

我正在使用ps,grep并sed尝试识别由某些特定参数(例如-DAppService=DDDABC_456或)唯一标识的某些Java进程-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脚本中,可以从其他地方调用。

展开
收起
祖安文状元 2020-01-06 15:25:07 368 0
1 条回答
写回答
取消 提交回答
  • s -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),command($2)和相关参数($i)

    2020-01-06 15:25:16
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载