如何匹配子字符串,在shell中进行字符串的常规匹配?

时间:2017-08-10 07:20:07

标签: shell awk sed

我正在检查这三个SUBSTRING是否在STRING中。

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
  4. 我尝试在我的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
    3. 我不得不说使用shell很难,没有办法在shell中处理字符串,shell必须通过awk,sed,grep等工具处理字符串。我不知道为什么。

      上一个问题:

      1. 如何将三个世界结合在一起?我想使用active*ACTIVE*DISTRIBUTING,但awksed报告错误。

2 个答案:

答案 0 :(得分: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。并且您可以根据您的要求更改为所需的替换。

答案 1 :(得分:0)

目前尚不清楚您正在寻找哪种解决方案,但从您的示例中,我猜您不需要保证符合POSIX标准的内容。

由于您似乎不需要子字符串的实际位置,但只显示子字符串是否出现,以下内容应至少在Zsh和bash中起作用:

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

我不清楚一起使用这些词是什么意思,但也许你的意思是

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