我需要帮助为 grep 构建一个正则表达式,以仅显示运行 Java 版本的路径

我需要帮助为 grep 构建一个正则表达式,以仅显示运行 Java 版本的路径

我需要帮助从 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/ .*$//'

(实际上$可以省略,因为“贪婪”匹配将包括直到行尾的所有字符,尽管通常为了易读性也将其包括在内。)

相关内容