我需要从一个讨厌的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
答案 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
部分用我们保存的两个子部分替换整个匹配并打印出来。