![我需要帮助为 grep 构建一个正则表达式,以仅显示运行 Java 版本的路径](https://linux22.com/image/1493939/%E6%88%91%E9%9C%80%E8%A6%81%E5%B8%AE%E5%8A%A9%E4%B8%BA%20grep%20%E6%9E%84%E5%BB%BA%E4%B8%80%E4%B8%AA%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%EF%BC%8C%E4%BB%A5%E4%BB%85%E6%98%BE%E7%A4%BA%E8%BF%90%E8%A1%8C%20Java%20%E7%89%88%E6%9C%AC%E7%9A%84%E8%B7%AF%E5%BE%84.png)
我需要帮助从 ps -ef 构建一个 grep 来仅返回 java 路径。
假设我们有以下正在运行的进程:
bash> ps -ef | grep java
user pid# 1 1 00:00 ? 00:04:00 /path/to/java/jdk_1.8/bin/java -foo=bar -foo2=bar2 ... etc.
我要表达的是:
bash> ps -ef | grep 'some regex or pattern here'
/path/to/java/jdk_1.8/bin/java
谢谢大家。
答案1
那会grep -oP "/.*?/bin/java"
从找到的第一个斜杠开始,然后尝试匹配,直到第一次出现 /bin/java。大写字母 P 在 grep 中获得了良好的正则表达式支持
或者这样,甚至不需要使用 grep 的 -P。grep -oP "/.*/bin/java"
从第一个正斜杠开始,然后尽可能匹配任何字符,直到 /bin/java 为止。
如果您必须自己从头开始解决,那么除了了解正则表达式之外,您还可以使用 echo eg 快速测试,echo user pid# 1 1 00:00 ? 00:04:00 /path/to/java/jdk_1.8/bin/java -foo=bar -foo2=bar2 ... etc. | grep
然后尝试模式。您还可以将 -i 添加到 grep egor 中,并与 -o so -io 混合使用,使其不区分大小写(-i 的作用)。
注意-以上内容很好,但我只想指出,如果您对正则表达式或技术细节感兴趣- .*blah
这有点有趣,因为.*
(贪婪评估)可以包含 blah,因此如果您有 5 次 blah,那么它将匹配 blah 5 次。4 来自.*
,最后一个来自 blah。有.*?blah
(惰性评估)可以匹配任何字符,直到第一个 blah。虽然这需要 -P。但在您查找 /bin/java 的情况下,您不会在一行中多次获得 /bin/java,因此使用.*
没有 ? 的没有什么大不了的/问题。
答案2
我觉得ps
打印大量你不想要的信息有点愚蠢,然后必须使用复杂的grep
表达式来提取你想要的信息做想要。以下似乎是更好的方法:
ps -C java -o cmd=
这将为您提供命令中的参数列表,但您可以使用过滤器将其修剪为参数 0 sed
:
ps -C java -o cmd= | sed 's%\(/java\) .*$%\1%'
如果路径中没有空格(几乎可以肯定是这样)java
,则可以使用更简单的过滤器:
ps -C java -o cmd= | sed 's/ .*$//'
(实际上$
可以省略,因为“贪婪”匹配将包括直到行尾的所有字符,尽管通常为了易读性也将其包括在内。)