我有很多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
讽刺的是,对于这个特定的任务来说,它并不是真正需要的,也很有用。