如何使用正则表达式选择 awk 列?

如何使用正则表达式选择 awk 列?

我有很多java进程在服务器上运行,并且由于这是一台开发服务器,所以我有多个env正在运行。

如果我想列出特定环境的进程,我这样做是为了提供一个简短的可读列表,因为 java 命令很长,有很多参数:

ps -ef|grep ENV-NAME|grep -v grep|awk '{print $2 " " $32}'

这将打印进程 ID 和正在运行的 java 类的名称。

然而,正如您所知,它依赖于始终位于同一列 (32) 中的 java 类名。

如果我向其中一个进程添加一个参数,它显然会选择错误的列,并且进程列表不再有意义。

java 类名始终采用com.company.start.name.

我可以在 awk 中使用此信息来使用正则表达式而不是列号来选择正确的列吗?

答案1

您无法根据正则表达式精确选择列,但您可以这样做:

ps -ef | awk ' /[E]NV-NAME/{ match($0, /[a-z]+\.[a-z]+\.[a-z]+\.[a-z]+/); print( $2 " " substr($0, RSTART, RLENGTH)) }'

我删除了 grep,将其改为多行以便更易读,您可能希望在一个函数中捕获所有这些。

PS 我对 awk 正则表达式也很生疏,所以你也许可以改进这个match语句。

PPS 该[E]NV-NAME语法是一种方便的快捷方式,可以防止正则表达式在ps输出中匹配自身。grep讽刺的是,对于这个特定的任务来说,它并不是真正需要的,也很有用。

相关内容