如何从 ps 命令中提取键值对

如何从 ps 命令中提取键值对

我正在尝试从ps命令中提取应用程序名称,如下所示:

ps -af -u sas |grep "java"| grep -v "grep"

它产生以下结果:

sas 24431     1  0 Oct10 ?        00:51:08 /usr/lib/jvm/java-1.7.0-oracle-1.7.0.25.x86_64/jre/bin/java -Denv=DEV -Dapp.name=myApp -Xms512m -Xmx1g -Dlog.dir=/apps/java/logs

我尝试使用egrep但似乎不起作用:

ps -af -u sas|grep "java"| grep -v "grep"| egrep -o "-Dapp.name"

我怎样才能只获取-Dapp.name值“myApp”?

答案1

您没有显示收到的错误消息,但它可能是

grep:未知设备方法

这是因为,像所有或至少大多数其他命令行程序一样,grep假设以 a 开头的任何内容-都是一个选项,并尝试按此方式解析它。在本例中,-D用于指示grep如何处理设备文件(man grep详细信息请参见)。解决这个问题的一种方法是使用--which 告诉grep后面的任何内容都不是选项标志。

结合 GNU 的 PCRE 功能grep,您可以执行以下操作:

ps -af -u sas | grep -v grep | grep -Po -- '*-\KDapp.name=[^\s]+'

正则表达式搜索 a-并将其丢弃 ( ),然后是后跟尽可能多的非空格字符的\K字符串。Dapp.name=输出是:

Dapp.name=myApp

如果您希望myApp将部分保存在变量中,我会单独搜索:

ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+'

要将其分配给变量:

$ app="$(ps -af -u sas | grep -v grep | grep -Po -- '-Dapp.name=\K[^\s]+')"
$ echo $app
myApp

但是,你永远不应该grep输出ps这种东西,那就是pgrep用于:

app="$(pgrep -a java | grep -Po -- '^Dapp.name=\K[^\s]+')"

答案2

awk

ps -af -u sas | awk 'BEGIN {RS=" "}; /-Dapp.name/'

答案3

ps -af -u sas | sed -n '/[j]ava/s/.*-Dapp\.name=\([^ ]*\).*/\1/p'

答案4

比其他答案更复杂,但这用于getopt为您处理解析。还有另一种选择。

getopt -aql 'Dapp.name:' $(\
    ps -af -u sas | grep java | grep -v grep | tr -s ' ' | cut -d' ' -f8-\
) | cut -d"'" -f2
  1. 你的命令:ps -af -u sas | grep java | grep -v grep
  2. tr -s ' '将多个空间“挤压”成一个空间,以准备cut
  3. cut -d' ' -f8-用空格分割行并抓取 8 之后的所有字段(含 8),结果为/usr/lib/jvm/java-1.7.0-oracle-1.7.0.25.x86_64/jre/bin/java -Denv=DEV -Dapp.name=myApp -Xms512m -Xmx1g -Dlog.dir=/apps/java/logs
  4. getopts -aql 'Dapp.name:' $(...)解析命令选项并仅输出与Dapp.name具有值的人匹配的长名称(由 表示:),结果为--Dapp.name 'myApp' --
  5. cut -d"'" -f2获取单引号中的内容
  6. 结果是:myApp

相关内容