從PS

2014-04-30 69 views
0

我期待從ps -ef | grep classpath myprog.jar從PS

root 20925 20886 1 17:41 pts/0 00:01:07 /opt/myprog/java/jre/bin -classpath myprog.jar 

的java的輸出提取BASEDIR的輸出提取基目錄總是BASEDIR 下一個子目錄的安裝路徑可以改變服務器到服務器例如

/usr/local/myprog/java/jre/bin 

/opt/test/testing/myprog/java/jre/bin 

所以一旦我有我的字符串,我怎麼以前的Java 直到路徑的起點提取了從

也就是說,/usr/local/myprog/opt/test/testing/myprog/

+0

對不起@gniourf_gniourf,我想我們都在同一時間編輯。請隨時在您認爲正確的地方進行更改。由於OP的輸出與他所要求的不一致,我恰當地修改了預期的輸出。 –

+0

@JS웃不要擔心,我們的編輯非常相似! (而你的確更加準確)。 –

+1

'ps axo args'將列出系統上每個進程的完整命令(包括路徑)。這是'ps'的BSD風格格式說明符,所以應該主要適用於Linux和OSX。 –

回答

1

使用SED:

$ echo "root 20925 20886 1 17:41 pts/0 00:01:07 /opt/myprog/java/jre/bin -classpath myprog.jar" | sed 's/.*\ \(.*\)\/java.*/\1/' 
/opt/myprog 
0

使用grep -P

ps -ef | grep -oP '\S+(?=/java)' 
/opt/myprog 

如果你的grep不支持-P然後使用:

s='root 20925 20886 1 17:41 pts/0 00:01:07 /opt/myprog/java/jre/bin -classpath myprog.jar' 
[[ "$s" =~ (/[^[:blank:]]+)/java ]] && echo "${BASH_REMATCH[1]}" 
/opt/myprog 
+0

返回返回/ opt/myprog/java/jre/bin – eramm

+1

查看這個演示的解決方案:http://ideone.com/cpSK1W – anubhava

-1

可以匹配以下正則表達式:

'((\/\w+)+)\/java'

和捕獲的第一組\1$1將包含期望字符串

演示:http://regex101.com/r/zU2vV4

+1

這表明你知道正則表達式,但沒有提供問題的答案。 –

0
echo "root 20925 20886 1 17:41 pts/0 00:01:07 /opt/myprog/java/jre/bin -classpath myprog.jar" | awk '{split($8,a,"/java"); print a[1]}' 
0

使用pgrep找到所有的Java進程而不是使用ps -ef | grep ...。這樣,您不必擔心您的grep命令顯示爲您的項目之一。

,而不是運行ps -ef的,你可以使用-o選項只拉起所需的字段,以及最ps命令採取--no-header消除頭字段。這樣,你的腳本不必擔心標題行。

最後,我使用Shell Parameter Expansion這有時比使用sed改變一個變量比較容易的方式:

$ ps -o pid,args --no-headers $(pgrep -f "java .* myproj.jar") | while read pid command arguments 
do 
    directory=${command%/java*} 
    echo "The directory for Process ID $pid is $directory" 
done 

順便說一句,你可以運行多個命令,所以我遍歷ps命令。

0
ps axo args | awk '/classpath myprog.jar/{print substr($0, 0,index($0, "java")-1)}' 

例如:

$ echo '/opt/myprog/java/jre/bin -classpath myprog.jar' \ 
    | awk '/classpath myprog.jar/{print substr($0, 0,index($0, "java")-1)}' 
/opt/myprog/ 

你可以(而且可能應該)切換兩個$0的年代到$1的,如果你肯定知道你的路徑將不能包含空格。或者使用逗號將其他字段添加到ps -o列表中(如在o pid,args中),並使用$2而不是$1