我需要幫助從 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"
?大寫 P 從 grep 獲得良好的正規表示式支持
或這個,甚至不需要 grep 的 -P 。grep -oP "/.*/bin/java"
從第一個正斜線開始,然後匹配盡可能多的任何字符,直到(包括 /bin/java)。
如果您必須從頭開始自己解決這個問題,那麼除了了解正規表示式之外,您還可以使用 echo 快速測試事物,例如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 添加到與 -o so -io 混合的 grep egor 中,使其不區分大小寫(-i 的作用)。
注意 - 上面的內容很好,但我只是注意到,如果您對正則表達式或技術細節感興趣 - .*blah
有點有趣,因為.*
(貪婪的評估)可以包含一個廢話,所以如果您有廢話5 次,那麼它會配對廢話5次。 4 來自.*
和最後一個來自 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/ .*$//'
(事實上,$
可以省略,因為「貪婪」匹配將包括直到行尾的所有字符,儘管為了易讀性通常也包括它。)