想要输出当前运行的 java 进程的摘要。我感兴趣的字段是 PID、开始时间、最小堆、最大帮助和应用程序名称。 PID 和开始时间始终处于同一位置,因此 awk 对它们来说运行良好。但是,根据用于启动 JVM 的参数,最小堆(以 -Xms 开头并以 m 结尾)、最大堆(以 -Xmx 开头并以 m 结尾)以及可以从字段开头收集的应用程序名称与 -Djboss.server.base 最终处于不同的位置,因此 awk 的位置编号不一致。这是适用于大多数流程的方法。我们如何改进它,以便它找到 ps 输出中的最小/最大堆和应用程序名称?
ps -ef |grep "D\[S" |awk '{printf "%5s %5s %9s %9s %-35s\n",$2, $5, $(NF-16), $(NF-15), $(NF-2)}' | \
sed 's/-Djboss.server.base.dir=\/usr\/share\/jboss-as\///g' | sed 's/-standalone//g' | \
sort -k5 | tee /dev/stderr | wc -l | sed -e '$s/$/ JBoss JVMs running/'
预期产出
715456 11:13 -Xms512m -Xmx512m app1
721978 13:08 -Xms512m -Xmx512m app2
722824 13:16 -Xms128m -Xmx128m app3
562899 Feb15 -Xms512m -Xmx512m app4
655796 Feb16 -Xms1024m -Xmx1024m app5
5 JBoss JVMs running
但是,对于某些应用程序,堆大小的位置和 -Djboss.server.base 限定符不在指定位置。对于那些输出是不正确的。例如:
620378 Feb16 -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman app6
正在运行的进程的示例。
jboss 653349 653268 0 Feb16 ? 00:00:39 java -D[Standalone] -server -verbose:gc -Xloggc:/usr/share/jboss-as/witr_standalone/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=3M -XX:-TraceClassUnloading -Xms1024m -Xmx1024m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman,com.sun.crypto.provider -Djava.awt.headless=true -Djboss.modules.policy-permissions=true -Dorg.jboss.boot.log.file=/usr/share/jboss-as/witr_standalone/log/server.log -Dlogging.configuration=file:/usr/share/jboss-as/witr_standalone/configuration/logging.properties -jar /usr/share/jboss-as/jboss-modules.jar -mp /usr/share/jboss-as/modules org.jboss.as.standalone -Djboss.home.dir=/usr/share/jboss-as -Djboss.server.base.dir=/usr/share/jboss-as/witr_standalone -c standalone.xml
预期产出
653349 Feb16 -Xms1024m -Xmx1024m witr
答案1
使用 GNU sed for-E
启用 ERE 和\s/\S
简写[[:space:]]/[^[:space:]]
:
$ cat file | sed -E 's:\S+\s+(\S+)(\s+\S+){2}\s+(\S+).*(-Xms[0-9]+m).*(-Xmx[0-9]+m).*-Djboss\.server\.base\.dir[^ ]+/([^ ]+)_standalone.*:\1 \3 \4 \5 \6:'
653349 Feb16 -Xms1024m -Xmx1024m witr
显然,在上面我使用的cat file
不仅仅是ps -ef
使用您提供的示例输入进行测试:
$ cat file
jboss 653349 653268 0 Feb16 ? 00:00:39 java -D[Standalone] -server -verbose:gc -Xloggc:/usr/share/jboss-as/witr_standalone/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=3M -XX:-TraceClassUnloading -Xms1024m -Xmx1024m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman,com.sun.crypto.provider -Djava.awt.headless=true -Djboss.modules.policy-permissions=true -Dorg.jboss.boot.log.file=/usr/share/jboss-as/witr_standalone/log/server.log -Dlogging.configuration=file:/usr/share/jboss-as/witr_standalone/configuration/logging.properties -jar /usr/share/jboss-as/jboss-modules.jar -mp /usr/share/jboss-as/modules org.jboss.as.standalone -Djboss.home.dir=/usr/share/jboss-as -Djboss.server.base.dir=/usr/share/jboss-as/witr_standalone -c standalone.xml