我正在尝试从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
- 你的命令:
ps -af -u sas | grep java | grep -v grep
tr -s ' '
将多个空间“挤压”成一个空间,以准备cut
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
getopts -aql 'Dapp.name:' $(...)
解析命令选项并仅输出与Dapp.name
具有值的人匹配的长名称(由 表示:
),结果为--Dapp.name 'myApp' --
cut -d"'" -f2
获取单引号中的内容- 结果是:
myApp