从PS

2014-04-30 31 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