2017-07-25 117 views
1

我编码在外壳(bash)的,我的剧本是这样的:如何获得我给出的字符串后的字符串?

ps aux | grep something 

,其结果是:

something sds fgdsg -name i_want_this_string sdaf gfdsg dfgdf 

我想要得到的字符串 “i_want_this_string”,以及位置这个字符串不是固定的,它总是跟着“-name”和空格,所以我不能使用awk。

那么如何获取字符串呢?谢谢〜

回答

2

使用grep

echo "$x"|grep -oP '\-name\s\K\w[^ ]+' 
i_want_this_string 

其中"$x"认为:something sds fgdsg -name i_want_this_string sdaf gfdsg dfgdf

1

用awk:

$ echo something sds fgdsg -name i_want_this_string sdaf gfdsg dfgdf | awk ' 
/something/ { 
    for(i=1;i<=NF;i++) 
     if($i=="-name") { 
     print $(i+1) 
     exit 
    } 
}' 
i_want_this_string 
+0

或'的ps aux | grep'/ something/{print $ 5}'作为给定*的输出*。但是,考虑到各种操作系统中'ps'的输出格式的潜在差异,''-name'的位置和下一个字段的处理更加健壮。 –

+0

@ DavidC.Rankin OP确实说过这个字符串的位置并不固定,它总是跟着“-name”_,我发现它很奇怪。 –

0

或使用... SED:

$ echo "something sds fgdsg -name i_want_this_string sdaf gfdsg dfgdf" | sed 's/^.*name \(\S*\) .*$/\1/' 

i_want_this_string

0
[email protected]:/$ ps_aux="something sds fgdsg -name i_want_this_string sdaf gfdsg dfgdf" 
[email protected]:/$ echo $ps_aux 
something sds fgdsg -name i_want_this_string sdaf gfdsg dfgdf 

对于可变的grep,这个简单的情况下,不需要OFC ,但由于您在多个字符串中搜索,我们应该添加grep以消除不相关的字符串。
Sed会把所有东西都吃掉直到找到“-name”。据我所知,输出中不需要“-name”,所以也要吃。

[email protected]:/$ echo $ps_aux | grep "\-name" | sed -e "s/.*-name //g" 
i_want_this_string sdaf gfdsg dfgdf 

好,但需要切掉所需字符串后的所有内容。让我们使用分隔符作为“空间”,并采取一个字符串的第一个切割。

[email protected]:/$ echo $ps_aux | grep "\-name" | sed -e "s/.*-name //g" | cut -f1 -d' ' 
i_want_this_string 
[email protected]:/$ 
0
  1. 纯shell脚本(使用参数扩展)假设没有 空间在-name选项的参数:

    n=$(ps aux | grep something) 
    n="${n#*-name }" 
    n="${n%% *}" 
    echo "$n" 
    
  2. 如果有可能空格,(即something sds fgdsg -name "i want this string" sdaf gfdsg dfgdf),这应该 工作:

    set -- $(ps aux | grep something) 
    while [ "$1" ] ; do 
        if [ "$1" = "-name" ] ; then 
         echo "$2" 
         break 
        fi 
        shift 
    done 
    
相关问题