2017-12-14 31 views
1

초 선두로부터의 BASH2 개 패턴 사이에 grep을하는 방법 - 나는 두 패턴 사이에 일치하는 두 번째 패턴까지 첫 번째 패턴과 일치하는 두 <p></p> 내가 다음 파일을 가지고에서 을 파일의 섹션을 추출해야

FileSet { 
    Name = "FileseT-XXXXX" 
    Include { 
    Options { 
     signature = MD5 
    } 
     File = /etc 
     File = /usr/sbin 
     File = /root 
     File = /srv/ 
} 
} 

#SECOND FILESET 
FileSet { 
    Name = "FileseT-XXXXX2" 
    Include { 
    Options { 
     signature = MD5 
    } 
     File = /srv/ 
} 

}

grep을 기반으로 'Name = "FileseT-XXXXX"'를 두 번째 "}"로 설정하여 섹션의 파일을 얻으려고합니다.

나는 처음 네 "파일"사전에

File = /etc 
    File = /usr/sbin 
    File = /root 
    File = /srv/ 

감사를 가져올.

답변

0

우선 데이터를 "FileseT-XXXXX"FileSet 사이에서 일치시켜 데이터 집합의 범위를 좁 힙니다. 그런 다음 원하는 File 부분을 추출합니다.

이 파일 만 추출하는 트릭을 수행해야합니다

pattern='XXXXX' 

awk -v n="\"FileseT-$pattern\"" '$0 ~ n {flag=1; next} /FileSet/{flag=0} flag' your_data_file | awk '/File =/{print $0}' 

당신은 쉘 변수로 패턴을 저장할 수 있습니다. -v 플래그로 awk에서 쉘 변수를 사용할 수 있습니다. 이렇게하면 스크립트에서 원하는 패턴을 쉽게 변경할 수 있습니다. awk 패턴 일치를 사용하면 "FileseT-XXXXX" 사이의 줄을 추출 할 수 있으며 출력에서 ​​첫 번째 발생 인 FileSet을 제외 할 수 있습니다. 그런 다음 배관을 (|) 다른 결과로 awk 전화, 우리는 원하는 라인을 추출합니다.

편집 :

"FileseT-XXXXX"}의 두 번째 발생 사이의 라인을 추출하려면 : 인쇄 단지 설명으로

awk -v n="\"FileseT-$n\"" '$0 ~ n {flag=1; next} /}/ && ++c == 2 {flag=0} flag' your_data_file 
+0

그게 잘 작동 하나의 질문, "FileseT-XXXXX"와 두 번째 '}'사이의 줄을 추출 할 수 있습니까? 감사 : D –

+0

예, 업데이트를 확인하고 '&& ++ c == 2'부분을 기록하십시오. – marcell

2

당신은 복잡 할 필요가 없습니다 대상 블록에있는 라인은 File =입니다. 필요한 것은 다음과 같습니다.

$ awk '/Name = /{f=/"FileseT-XXXXX"/} f && /File =/' file 
     File = /etc 
     File = /usr/sbin 
     File = /root 
     File = /srv/ 

이것이 전부가 아니라면 질문을 편집하여 더 정확한 샘플 입력/출력을 제공하십시오.

+1

@EdMorton에 감사드립니다. 귀하의 솔루션은보다 간결하고 간단합니다. – marcell

+0

반갑습니다. 다음에 수행 할 작업은 https://stackoverflow.com/help/someone-answers를 참조하십시오. –