행 및 형식 선택

행 및 형식 선택

라인 1과 "규칙" 이름이 선언된 해당 라인만 인쇄되도록 다음 출력 형식을 지정하는 방법이 있습니까? 구성에 따라 "규칙" 줄이 다를 수 있습니다. 4, 5, 8행 등이 될 수 있습니다. 표시된 대로 규칙 이름은 괄호 안에 있습니다. 아래의 "필수 출력" 예에 표시된 것처럼 첫 번째 줄이 규칙 줄과 함께 나타나는 것이 가장 좋습니다.

주문하다:show virtual server

원시 출력:

adc virtual name_of_virtual_server {
    output
    destination 10.201.111.101:80
    ip-protocol tcp
    mask 255.255.255.255
    pool test
    profiles {
        test {
            context clientside
        }
        test { }
        test data {
            context serverside
        }
    }
    rules {
        Exchange__all_services2.dat/Exchange__all_services2_rule7
    }
    source 0.0.0.0/0
    source-address-translation {
        pool data_pool
        type snat
    }
    vs-index 13
}

원하는 출력:

name_of_virtual_server
rules {
     Exchange__all_services2.dat/Exchange__all_services2_rule7

또는 - 더 나은 - 항목 사이에 빈 줄을 두는 것이 좋습니다.

Name: name_of_virtual_server
Rule: Exchange__all_services2.dat/Exchange__all_services2_rule7

sed나 awk를 사용하여 이를 달성할 수 있습니까? 중요한 경우 하나의 구성 파일에 수백 개의 가상 서버 구성이 있을 수 있다는 점을 명심하십시오.

답변1

이것은 Perl의 메소드입니다:

perl -ne 'if (/^adc\s+\w+\s+(\w+)/) { print "Name: $1\n" }
          elsif (/^\s*rules\s*{/) { $inrule = 1; }
          elsif (/}/) { $inrule = 0; }
          elsif (/^\s*(\S*)/) { print "Rule: $1\n" if $inrule; }'

파일의 각 줄을 살펴보고 Name:1 줄이 보이면 한 줄을 인쇄한 adc다음 rules {}청크를 식별하는 데 실패하여 각 줄을 Rule:.

입력 형식에 적합한 구문 분석기를 사용하는 것이 더 강력합니다. 레이아웃이 문제와 정확히 일치하지 않으면 이 줄이 깨집니다.

답변2

파일의 파일 형식에 맞는 파서가 있으면 이를 사용해야 한다. 이것이 누락된 경우 예제 입력에 적합한 해결 방법은 다음과 같습니다.

$ awk '/^adc/{print "name:",$3} /^[[:space:]]*rules/{getline;print "rule:",$1}' file
name: name_of_virtual_server
rule: Exchange__all_services2.dat/Exchange__all_services2_rule7

어떻게 작동하나요?

  • /^adc/{print "name:",$3}

    로 시작하는 줄의 경우 해당 줄의 세 번째 항목을 adc인쇄하세요 .name:

  • /^[[:space:]]*rules/{getline;print "rule:",$1}

    공백(선택 사항)으로 시작하고 뒤에 가 오는 줄의 경우 rules다음 줄의 첫 번째 항목이 인쇄됩니다.

관련 정보