2017-08-10 83 views
0

我在檢查這三個SUBSTRING是否在STRING中。如何匹配子串,在shell中進行字符串的常規匹配?

STRING:

active 
mac address ec:f4:bb:e1:0c:18 
Link Up - speed 10000 Mbps - full-duplex 
LACP actor_state ACTIVE AGGREGATION SYNC COLLECTING DISTRIBUTING 

SUBSTRING:

  1. 活性
  2. ACTIVE
  3. DISTRIBUTING

我嘗試在我的shell腳本使用這些:

dpdkb2_slave0_res=$(/usr/local/bin/ovs-appctl dpdk/bond-show dpdkb2 | sed -n '5,8p') 
dpdkb2_slave1_res=$(/usr/local/bin/ovs-appctl dpdk/bond-show dpdkb2 | sed -n '14,17p') 

s0_active=$(expr index $dpdkb2_slave0_res 'active') 
if [[ -n "$dpdkb2_slave0_res" && $s0_active -ne 0 ]] ; then 
    ok_output "dpdkb2 status is ok:" 
    ok_output "$dpdkb2_res" 

但在4號線,報錯:expr的:語法錯誤

但是,當我在shell中運行expr index $dpdkb2_slave0_res 'active'命令時沒關係。

  1. 如何解決這個問題?
  2. 如何做字符串位置,搜索,替換?哪一個最有效,expr{string##}awksed

我不得不說要使用shell很難,shell沒有辦法處理字符串,shell必須使用awk,sed,grep等工具來處理字符串。我不知道爲什麼。

最後一個問題:

  • 如何三個世界搭配在一起?我想使用active*ACTIVE*DISTRIBUTING,但awksed都報告錯誤。
  • +0

    如果只有*檢查這三個子字符串是否在STRING *(爲你寫) - 它可以用一個可實現在線方法 – RomanPerekhrest

    +0

    關於#3 - 'sed -r'/(active | ACTIVE | DISTRIBUTING)/'' – stevesliva

    回答

    0

    您可以實現所有要使用awk做,

    $ awk 'match($0,/ACTIVE/){printf "%d ",RSTART} sub("ACTIVE","xxx",$0)' file 
    18 LACP actor_state xxx AGGREGATION SYNC COLLECTING DISTRIBUTING 
    
    $ awk 'match($0,/active/){printf "%d ",RSTART} sub("active","yyy",$0)' file 
    1 yyy 
    
    $ awk 'match($0,/DISTRIBUTING/){printf "%d ",RSTART} sub("DISTRIBUTING","zzz",$0)' file 
    53 LACP actor_state ACTIVE AGGREGATION SYNC COLLECTING zzz 
    

    簡要交代,

    • 每個命令的第一輸出將是串的起點,即ACTIVE,active和DISTRIBUTING。
    • 該命令的第二個輸出結果將被特定模式替代,即xxx,yyy和zzz。您可以根據您的要求更改爲所需的替代品。
    0

    目前尚不清楚您正在尋找解決方案的shell,但從您的示例中,我想您不需要確保符合POSIX標準的東西。

    既然你似乎並不需要串的實際位置,但只有是否顯示了子,下面應該工作至少巖組和bash:

    if [[ $dpdkb2_slave0_res == *active* ]] 
    then 
        ok_output "dpdkb2 status is ok:" 
        ... 
    fi 
    

    目前尚不清楚給我你的使用的話一起的意思,但也許你的意思是這樣

    if [[ $dpdkb2_slave0_res == *ACTIVE*DISTRIBUTING* ]]