Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在awk语句中对字段aready使用模式匹配?_Regex_Linux_Awk - Fatal编程技术网

Regex 如何在awk语句中对字段aready使用模式匹配?

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

实际上,我正在尝试使用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.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
的参数将其输出字段限制为所需的字段以及所需的顺序。其次,您可以使用awk
split
函数重新拆分新分隔符上的字段以拆分路径等。@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
s
split()
函数可能也是非常复杂的
gsub()的替代方法
模式。@twalberg..是的,在与EdMorton辩论之后,我喜欢他的尝试(使用
NF-1
而不是
$8
)大多数情况下,只要路径的结构和长度与所讨论的相同,就可以这样做,使用
gsub
保留path的第二个最后一个参数更有效generic@hek2mgl如果使用最后第二个字段比使用第八个字段更健壮,那么只需使用$(NF-1)而不是$8会做任何更有用的事情。使用
NF-1
你会得到一个升级投票。然后它比
gsub
好得多,我没有想到这一点。但是,我会升级这个,最后它看起来和gsub一样强大,但复杂得多+1@EdMorton(回应你最后的第二个评论)->是的,你是对的:)