使用 AWK 解析命名参数值
Posted
技术标签:
【中文标题】使用 AWK 解析命名参数值【英文标题】:Parsing named parameter values using AWK 【发布时间】:2019-04-05 22:46:31 【问题描述】:我正在尝试提出一个脚本/别名,它可以快速为我提供应用程序运行的进程列表。应用程序用于启动进程的参数是命名参数,而不是位置
我需要提取-u、-s和-svn
的参数值$ ps -ef | grep pmdtm | grep -v grep
infa_adm 24581 31146 0 Oct24 ? 00:09:28 pmdtm -PR -gmh dhvifoapp03
-gmp 6015 -guid ddcbd7ab-2ed0-4696-aea3-01573968b1bc -rst 300
-s Address_Validator:wf_AddressValidator.s_m_AddressValidatorS
-dn Session task instance [s_m_AddressValidatorS] -c pmserver.cfg
-run 68_4262_654212_4_0_0_0_3263_77_2_2018_10_24___13_32_47_182
-u Administrator -uns Native -crd rlVuBI4mUFi1V/7/jyrD6f9dMurwD9Yxddio6KDy/
zwlzM5rRDMeV766VoSBqb3Snjlvu849sTXlWpJ8WjzPomNOF4U87H7x5oy
JKbtxVg/vjR6gPwWwVSdEHvPjlpwSKPcuDx6glCbB1ksrvKCAzRsW1BTlP
GOfQbnd1ptnkO83iY14k4LUpJlx8+upBhwSxk9a0TPD44byO+/4Qhe7Mg==
-svn Int01_dev -dmn Domain_dev
-nma https://DHVIFOAPP03.RENTERS-CHOICE-INC.COM:6005
-nmc w/Yt3IIMbmBQf+NnN1CAKmq5ab01nxZTJEA/YCf96Pb5zT9K9VFBO4+Nvqt
FuF8gzvqf/qHbw2tcXk4DnNP4m5vJvuEhxe9vQCN8pmpJytiZKV9Np7rBbapVzra
9TEOQVm9webRg8JZB70MQryVjQlGkJDpRs9cdOCXAu1aFhNE6LNF+
c5qhLdOz/vWCI3I2 -sid 3
-hhn dhvifoapp04.renters-choice-inc.com -hpn 15555
-hto 60 -rac 0 -SSL
-rsn RAC_dev ServiceResilienceTimeout=300
我可以使用以下命令为单个字段提取它,但是如何获取多个值?
$ echo "正在运行的作业列表 ==> "; ps -ef | grep pmdtm | grep -v grep | awk -F"-s " "print \$2"|awk -F" " ""print \$1"
List of running jobs ==>
Address_Validator:wf_AddressValidator.s_m_AddressValidatorS
期望的输出 =
List of running jobs ==>
Address_Validator:wf_AddressValidator.s_m_AddressValidatorS | Administrator | Int01_dev
【问题讨论】:
【参考方案1】:您可以在grep
中执行多个“OR”表达式,如下所示:
grep -E "^-s|^-u|^-svn" < file.txt
上面只会打印出以-s
、-u
或 -svn
开头的行。基于此,以下命令完全符合您的要求:
echo "List of running jobs ==> " $(ps -ef | grep pmdtm | grep -v grep | grep -E "^-s|^-u|^-svn" | awk ' print $2 " |" ')
使用上述命令在帖子上运行您的内容时,我得到以下输出:
List of running jobs ==> Address_Validator:wf_AddressValidator.s_m_AddressValidatorS | Administrator | Int01_dev |
最后你会得到一个尾随 |
,但你可以单独修剪它。
更新:
在您在下面发表评论后,更新命令以完全满足您的需要。
echo -e "List of running jobs ==> \n " $(ps -ef | grep pmdtm | grep -v grep | awk 'BEGIN RS = " -" $1 ~ /^s$|^u$|^svn$/ print $2,"|"')
它确实假设了几件事:
所有命名参数都将具有非空命名参数。否则,它只会输出一个空白。 所有命名参数都以-
开头,紧随其后的是参数本身。
【讨论】:
mJuarez - 感谢您的回复。我玩弄了你的建议,但它没有给我我正在寻找的输出。请注意,我在原始帖子中给出的示例都在一行中;不是多行。为了便于阅读,我可能已将问题分多行发布。 如果这是“ps -ef”的输出:pmdtpm -s abc:def.ghi -u mjuarez -svn int01_dev 我想要输出:abc:def.ghi |姆华雷斯 | int01_dev 在同一管道中,您永远只需要一个awk
、grep
、sed
或 cut
实例...另外,grep
-ing 通过输出ps
也很讨厌——使用 pgrep
。
@TBT100 添加到我的答案中,因此该命令完全符合您的需要。
@mjuarez - 您更新的解决方案有效;但是,awk 命令的结果出现在一行中。我尝试在打印命令中添加换行符,但这似乎不起作用。有什么想法/建议吗?以上是关于使用 AWK 解析命名参数值的主要内容,如果未能解决你的问题,请参考以下文章
NHibernate - 如何使用参数值记录命名参数化查询?
Python入门-5函数:06参数类型-位置参数-默认值参数-命名参数-可变参数-强制命名参数
Kettle位置参数(Argument)命名参数(Parameter)变量(Variable)