Regex 如何在awk语句中对字段aready使用模式匹配?
实际上,我正在尝试使用linux ps从java命令获取PID等。因为我可能有更多的那个,我想打破最后一个字段并提取唯一的路径 例如,我当前的命令是:Regex 如何在awk语句中对字段aready使用模式匹配?,regex,linux,awk,Regex,Linux,Awk,实际上,我正在尝试使用linux ps从java命令获取PID等。因为我可能有更多的那个,我想打破最后一个字段并提取唯一的路径 例如,我当前的命令是: ps -ef |grep java |grep root|awk {'print $1"\t"$5"\t"$2"\t"$13}' 我的结果是: root 08:11 1234 -Djava.library.path=/opt/path/to/My_Application/libs root 08:11 1234 -Djava.libra
ps -ef |grep java |grep root|awk {'print $1"\t"$5"\t"$2"\t"$13}'
我的结果是:
root 08:11 1234 -Djava.library.path=/opt/path/to/My_Application/libs
root 08:11 1234 -Djava.library.path=/opt/path/to/My_Other_Application/libs
root 08:11 1234 My_Applic
root 08:11 1234 My_Other_Application
我想让我的输出看起来像:
root 08:11 1234 My_Application
root 08:11 1234 My_Other_Application
我想我已经弄明白了,但还不太清楚……我最近的一次尝试是:
ps -ef |grep java |grep root|awk {'print $1"\t"$5"\t"$2"\t"substr($13,33,34)}'
这让我想到:
root 08:11 1234 My_Application/libs
root 08:11 1234 My_Other_Application/libs
考虑到我可以去掉第四个字段的最后5个字符,我尝试了:
ps -ef |grep java |grep root|awk {'print $1"\t"$5"\t"$2"\t"substr($13,33,34)}'|awk '{print $1"\t"$2"\t"$3"\t"substr($4,1,(length($4)-5))}'
但这并没有像我预期的那样删除最后5个字符…它似乎做了如下操作:
root 08:11 1234 -Djava.library.path=/opt/path/to/My_Application/libs
root 08:11 1234 -Djava.library.path=/opt/path/to/My_Other_Application/libs
root 08:11 1234 My_Applic
root 08:11 1234 My_Other_Application
更新:ps-ef试验的初步结果(应为通用结果):
ps-ef
UID PID PPID C TIME TTY TIME CMD
---- ---- ---- - ----- --- -------- --------------------------------------------------
根1234 100 0 2013?00:00:02/usr/lib/jvm/java-1.6.0.0/jre/binjava-cp/opt/path/to/My_Application/jars/*:/opt/path/to/My_Application/properties/:/opt/path/to/My_Application/*:-Djava.util.logging.config.file=/opt/path/to/My_Application/properties/logging.props-DkeyFile=/opt/path_-to/My_Application/properties/key.file-Djava.library.path=/opt/path/to/My_application/libs
…etc(已传递多个选项…但不需要)如果您正在搜索提取应用程序名称的方法,则需要在awk中使用
gsub
两次。检查此示例:
echo "-Djava.library.path=/opt/path/to/My_Application/libs" | \
awk '{ gsub(/\/[^\/]*$/, "", $4); gsub(/.*\//, "", $4); print $4}'
输出:
My_Application
这应该适用于所有版本的awk
最后的命令可以优化,因为您不需要
grep
命令,您可以直接在awk
中过滤感兴趣的行:
ps -ef | awk '/^root.*\-Djava/ { gsub(/\/[^\/]*$/, "", $8); gsub(/.*\//, "", $8); print $8}'
首先,您应该使用
ps
的参数将其输出字段限制为所需的字段以及所需的顺序。其次,您可以使用awksplit
函数重新拆分新分隔符上的字段以拆分路径等。@EtanReisner是的,也会使用ps-u root
,但是ps
的输出中没有root…
,这不是我所说的选项(但这不是一个坏的开始)如果您知道用户名,您可以稍后将其添加回awk。我说的是列选择选项。你可以控制ps向你吐出的信息位,而不必从默认输出中解析出你想要的列。@EtanReisner是的,当然……我确实尝试了最后一个字符的“拆分”,但我一直得到两个字符……我用它代替了最后一个子字符串……让我看看我的历史记录,也许你可以告诉我它有什么问题:好吧,看起来我试过了:拆分($4,x,“/”)而不是substr($4,1,(长度($4)-5),但我在第四个字段中得到的只是数字2(大概是两个“数组值”)…但是我如何显示第一个数组值而不是当前的第四个字段?hek2mgl-从echo语句中,我只需要一个字段分隔符“/”并打印第五个字段。我需要做的是将该值附加到“我的应用程序”中从以前的awk输出。谢谢。是的…它返回零。哦,当从ps-ef
进行管道输送时,它是$8
,而不是$4
,对不起,我的错误。你能再试一次吗?awk
ssplit()
函数可能也是非常复杂的gsub()的替代方法
模式。@twalberg..是的,在与EdMorton辩论之后,我喜欢他的尝试(使用NF-1
而不是$8
)大多数情况下,只要路径的结构和长度与所讨论的相同,就可以这样做,使用gsub
保留path的第二个最后一个参数更有效generic@hek2mgl如果使用最后第二个字段比使用第八个字段更健壮,那么只需使用$(NF-1)而不是$8会做任何更有用的事情。使用NF-1
你会得到一个升级投票。然后它比gsub
好得多,我没有想到这一点。但是,我会升级这个,最后它看起来和gsub一样强大,但复杂得多+1@EdMorton(回应你最后的第二个评论)->是的,你是对的:)