如何在awk语句中使用字段上的模式匹配?

时间:2014-01-17 16:07:33

标签: 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.library.path=/opt/path/to/My_Other_Application/libs

我想让我的输出看起来像:

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  My_Applic
root 08:11  1234  My_Other_Application

更新:来自ps -ef statment的初始结果(shoudl be universal):

ps -ef UID PID PPID C STIME TTY TIME CMD ---- ---- ---- - ----- --- -------- --------------------- ----------------------------- root 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 = /选择/路径/到/ my_application之类/库  ......等等(传递了几个选项......但不需要)

2 个答案:

答案 0 :(得分:1)

ps -ef |awk -F' +|/' '/root.*java/{print $1, $2, $3, $8}'

答案 1 :(得分:0)

如果您正在搜索提取应用程序名称的方法,则需要在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}'