これを簡単に実行できるかどうかはわかりませんが、次のようになります。
このようなファイルがあります。
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の間の行数が可変であるため、ドメイン名を取得する方法について心配しています。デフォルトでは、volnameをgrepしてもう一度「検索」して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
シェル変数から変数をキャプチャするには、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