![根据正则表达式查找父字符串](https://linux22.com/image/34705/%E6%A0%B9%E6%8D%AE%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%9F%A5%E6%89%BE%E7%88%B6%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
不确定我是否可以轻松做到这一点,但是:
我有一个像这样的文件
VDS|name=vds01|another_parameter
vol=disk01|parameter|dev=/dev/dev/my_dev1|parameter_A=some_value1
vol=disk02|parameter|dev=/dev/dev/my_dev2|parameter_A=some_value2
vol=disk03|parameter|dev=/dev/dev/my_dev3|parameter_A=some_value3
DOMAIN|name=domain01
VDISK|name=disk01|vol=disk01@vds01|parameter_B=some_valueB|parameter_C=some_value
VDISK|name=disk02|vol=disk02@vds01|parameter_B=some_valueB|parameter_C=some_value
DOMAIN|name=domain02
VDISK|name=disk03|vol=disk03@vds01|parameter_B=some_valueB|parameter_C=some_value
现在我想通过 /dev/dev/my_dev2 grep 并获取卷名和域名。我通过以下方式获取卷名:
volname=`grep $dsk ldm_ls-o_disk.out|uniq|cut -d\| -f2|cut -d= -f2`
这将为我提供 disk02,但现在我陷入了如何获取域名的困境,因为我可以有多个 VDISK,并且 VDISK 和 DOMAIN 之间的行数是可变的。基本上我想 grep volname 并“搜索”回来找到 DOMAIN 标签并从中获取名称。
答案1
假设域是匹配 VDISK 行之前的最新域,我将使用 awk:
awk -F '[=|]' -v dev="/dev/dev/my_dev2" '
$1 == "vol" && $5 == dev {vol = $2}
$1 == "DOMAIN" {domain = $3}
$1 == "VDISK" && $3 == vol {print vol, domain; exit}
' file
这输出
disk02 domain01
要捕获 shell 变量中的变量,请使用read
进程替换:
get_domain () {
awk -F '[=|]' -v dev="$1" '
$1 == "vol" && $5 == dev {vol = $2}
$1 == "DOMAIN" {domain = $3}
$1 == "VDISK" && $3 == vol {print vol, domain; exit}
' file
}
read volume domain < <(get_domain "/dev/dev/my_dev2")
答案2
目前我正在使用这个解决方案,但我想要更干净的东西。
volname=`grep $dsk ldm_ls-o_disk.out|uniq|cut -d\| -f2|cut -d= -f2`
linenr=`grep -n $volname ldm_ls-o_disk.out |grep VDISK|cut -d\: -f1`
retval=1
while [ $retval -eq 1 ]
do
line=`sed -n "${linenr}p" ldm_ls-o_disk.out|grep DOMAIN`
if [ $? -eq 0 ]; then
retval=0;
domain=`echo $line |cut -d= -f2`
else
linenr=$(($linenr-1))
fi
done