我在服务器上运行了很多 java 进程,因为这是一个开发服务器,所以我运行了多个环境。
如果我想列出特定环境的进程,我这样做是为了给出一个简短的可读列表,因为 java 命令很长,有很多参数:
ps -ef|grep ENV-NAME|grep -v grep|awk '{print $2 " " $32}'
这将打印进程 ID 和正在运行的 java 类的名称。
但是,正如您所知,它依赖于 java 类名始终位于同一列 (32) 中。
如果我向其中一个进程添加参数,它显然会选择错误的列,并且进程列表不再有意义。
java 类名始终采用com.company.start.name
.
我可以在 awk 中使用此信息使用正则表达式而不是列号来选择正确的列吗?
您无法根据正则表达式精确选择列,但您可以这样做:
ps -ef | awk ' /[E]NV-NAME/{ match($0, /[a-z]+\.[a-z]+\.[a-z]+\.[a-z]+/); print( $2 " " substr($0, RSTART, RLENGTH)) }'
我已经删除了 greps,使其多行更清晰,您可能希望在一个函数中捕获所有这些。
PS 我对 awk 正则表达式也生疏了,所以你也许可以改进这个
match
陈述。PPS
[E]NV-NAME
语法是防止正则表达式在ps
输出中匹配自身的便捷快捷方式。同样有用的grep
是,具有讽刺意味的是,这个特定任务并不真正需要它。