2017-07-25 116 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 
    
相關問題