【问题标题】:Finding a process by argument string通过参数字符串查找进程
【发布时间】:2019-07-03 13:42:48
【问题描述】:

我正在使用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 脚本中。

【问题讨论】:

  • 很高兴你把你的问题放在上下文中,但是帮助 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 输出中任何进程的任何参数都会生成相同的结果格式。

标签: linux awk sed grep ps


【解决方案1】:
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 输出

【讨论】:

  • 感谢 jhnc 的输入,它确实帮助我制定了我的脚本,也加深了我对 ps 和 awk 的理解,但我最终得到了一些更冗长且更易于阅读的东西。
猜你喜欢
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 2015-08-18
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多