라인 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
다음 줄의 첫 번째 항목이 인쇄됩니다.