정규식을 기반으로 상위 문자열 찾기

정규식을 기반으로 상위 문자열 찾기

이 작업을 쉽게 수행할 수 있는지 확실하지 않지만 다음과 같습니다.

이런 파일이 있어요

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

관련 정보