0

我需要从一个大的讨厌的 ps 字符串中解析一些信息。我需要获取用户名和 PID,然后将 /usr/user/java.instanceName/ 部分放在一行中。

我尝试了 grep、sed 和 awk,但我不太了解它们中的任何一个。在为这个简单的任务阅读了几个小时之后,我希望有人可以快速敲出一条线。

这是我在询问之前尝试的最后一件事:

ps auxwww | sed 's/^[a-z]* *[0-9]*//g;s/\/usr\/user\/[a-z._0-9]*//g'

这是 ps auxwww 命令的标准输出:

根 3837 2.5 32.5 4697784 2657720 ?Sl Sep13 30:23 /usr/java/jdk16/bin b.WebService.port=80 -Dorg.jboss.naming.NamingService.port=90 -Dorg.jboss.na mi.port=90 -Dorg.jboss.invocation。 jrmp.server.JRMPInvoker.port=40 -Dorg.jbos server.PooledInvoker.port=41 -Dorg.jboss.remoting.transport.Connector.port=42 ing.transport.Connector.messaging.port=180 -Dorg.jboss。 remoting.transport.Conn 1 -Djboss.bind.address=10.0.0.1 -Dtomcat.bind.address=10.0.0.1 -Dtomca cat.https.port=443 -Djava.net.preferIPv4Stack=true
che.cluster.name=cluster =INVALIDATION_ASYNC
cache.mcast.port=457 -Dejb3.cache.mode=LOCAL -Dejb3.cache.cluster.name=EJB3-en ss.platform.mbeanserver -Djavax.management.builder.initial=org.jboss.system.serv ilderImpl -服务器 -Dsun.security.ssl.allowUnsafeRenegotiatio
ed.dirs=/usr/user/java.instanceName/lib/endorsed -Dsun.rmi.dgc.client.gcInte mi.dgc.server.gcInterval=3600000 -Djavax.net.ssl .trustStore=/usr/java/jdk16/jre/ -Djavax.net.ssl.trustStorePassword=pass123 -Djavax.net.ssl.trustStoreType=JKS pGC -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled -XX:+UseParNewG m - XX:PermSize=512m -XX:MaxPermSize=512m -jar run.jar -c jvmname -b 10.0.1.1

4

1 回答 1

1

我认为这应该有效:

ps auxww | sed -n -e '/java.instanceName/s;\(^[a-z]* *[0-9]*\).*\(/usr/user/java.instanceName[A-Za-z._0-9/]*\) .*;\1 \2;p'

分解如下:sed -n关闭每一行的默认打印操作;/java.instanceName/只会选择其中包含该模式的行;该s命令;用作分隔符,因为/稍后在模式中使用;\(^[a-z]* *[0-9]*\)就像您拥有的那样,并在行首匹配用户和 PID,但具有精确保存匹配内容的额外效果;然后我们跳过所有内容,直到\(/usr/user/...[A-Za-z._0-9/]*\)匹配前缀为/usr/user/(我调整了字符类以包括大写和/)的路径 - 保存以备将来使用;最后,该路径之后的空间和其他所有内容都匹配了。该;\1 \2;p部分用我们保存的两个子部分替换整个匹配并将其打印出来。

于 2012-09-14T18:48:38.473 回答