从一个命令获得两个正则表达式匹配

时间:2012-09-14 17:59:23

标签: shell

我需要从一个讨厌的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命令中的标准:

  

root 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 ildImpl -server -Dsun.security.ssl.allowUnsafeRenegotiatio
  ed.dirs =的/ usr /用户/ java.instanceName / LIB /认可   -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

1 个答案:

答案 0 :(得分: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部分用我们保存的两个子部分替换整个匹配并打印出来。