Shell 从一个命令中获取两个正则表达式匹配项

Shell 从一个命令中获取两个正则表达式匹配项,shell,Shell,我需要从一个大字符串中解析一些信息。我需要获取用户名和PID,然后将/usr/user/java.instanceName/part放在一行中 我试过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 46977

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

我试过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=invalization\u ASYNC
cache.mcast.port=457-devb3.cache.mode=LOCAL -Dejb3.cache.cluster.name=EJB3 en ss.platform.mbeanserver -Djavax.management.builder.initial=org.jboss.system.serv ilderImpl-server-Dsun.security.ssl.allowunsaferenegatio
ed.dirs=/usr/user/java.instanceName/lib/annowed -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:+cmsclasssunloadingenabled-XX:+cmspermgensweepengenabled-XX:+UseParNewG m-XX:PermSize=512m-XX:MaxPermSize=512m-jar run.jar-c jvmname-b 10.0.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.\u 0-9/]*\)
与前缀为
/usr/user/
的路径匹配(我调整了字符类以包含大写字母和
/
)-保存以备将来使用;最后,该路径后面的空间与其他所有内容匹配。
\1 \2;p
part将整个匹配替换为我们保存的两个子部分并将其打印出来。

也许我只是瞎了眼,但我在
ps
的输出中根本看不到子字符串“integral7”,所以
sed
表达式的后半部分不会起任何作用……噢,我已对输出进行了消毒,我将进行编辑以匹配这一点,但我忘了提到java.instanceName是一个变量。我需要查看服务器上运行的所有实例。我试着玩sed,但我不完全理解它。那么,你只需要
/usr/user/
之后和
/lib…
之前的部分就可以了?在这种情况下,
sed-n-e'/java.instanceName/s\(^[a-z]**[0-9]*\).*/usr/user/\([a-Za-z.[u 0-9]*\)/lib.*\1 \2;p'
应该抓住该字符串的“下一部分”。几乎在那里,我一直得到一个尾随的/lib/背书,这不是什么大问题,但是仅仅从[a-Za-z.\u 0-9/]字符类中删除/是不起作用的。有什么建议吗?没关系,明白了。ps auxww | sed-n-e'/java.instance/s;(^[a-z0-9]*[0-9]*).*/usr/user/([a-Za-z.[U 0-9]*)/\1 \2;谢谢你的帮助。