我还有一个关于 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