检索并分配给变量的重复信息

检索并分配给变量的重复信息

我还有一个关于 bash 的问题。

在文本文件中,有一组信息。这里的常量是“sys app”,结尾是“checker”

sys app /partition/app_webapps_80 {
load-balancing-mode least-connections-member
members {
    /partition/host-1:80 {
        address 10.20.20.200
    }
    /partition/host-2:80 {
        address 10.20.20.201
    }
}
checker /partition/tcp 
}
sys app /partition/app_webapps_8989 {
    members {
        /partition/host-1:8989 {
            address 10.20.20.200
        }
        /partition/host-2:8989 {
            address 10.20.20.201
        }
    }
    checker /partition/tcp 
}

我所做的是创建一个 while 循环,然后使用以下命令,但是我得到的地址复制了文件中的行数。

line=1

while read do rs=$(sed -n '/sys app/,/checker/p' filename |grep -m $line "address" |tail -n 1) 
echo `$rs 
line=$[$line +1]`


done < filename

如果我只想匹配两个字符串之间的一些信息,然后将其分配给以后可以使用的变量,我应该怎么做?

感谢任何关于此事的建议。


因为在 app_webapps_80 和 app_webapps_8989 下它们具有相同的地址 10.20.20.200 和地址 10.20.20.201

预期结果是运行循环。循环将运行以确定 app_webapps_80 和第一个检查器之间有多少个地址

然后将地址 10.20.20.200 分配给一个变量使用,然后将地址 10.20.20.201 分配给另一个变量使用

循环将再次运行以识别新的 app_webapps_8989,并且该部分中的检查器将重复其对第一组执行的操作。

不确定我的理解是否正确?

答案1

我认为,不需要进行范围匹配,从上到下阅读会更容易。

#!/bin/bash

declare -A A=()

while read -r b c; do
    A[$b]=$c
done < <(awk '
    /^ *sys app /{b=substr($3,12)}
    /^ *address /{a[b]=sprintf("%s %s",a[b],$2)}
    END {
        for(c in a){print c a[c])}
    }' file)

# Let's iterate the assosiative array.
for d in ${!A[@]}; do
    set -- ${A[$d]}
    echo 1st   - $d: $1
    echo 2nd   - $d: $2
    echo All   - $d: $@
    echo Last  - $d: ${@:(-1)}
    echo Range - $d: ${@:1:2}
done

相关内容