awk: 두 패턴 사이에 텍스트 + x 줄을 인쇄하고 첫 번째 일치 항목이 이어집니다.

awk: 두 패턴 사이에 텍스트 + x 줄을 인쇄하고 첫 번째 일치 항목이 이어집니다.

다음 입력 파일:

#Report Nr. 2343215
#Errors 3243
#Date: (Timestampt)
#Informaiton
#
# Headers
# Specs
DLSLWD 0 0 0 0 Jun 22 01:51:16PM 2018
#List of Objects
#
# Headers
# Paths
Files not found /var/xxxxx
Files not found /etc/xxxxx
Files not found /mnt/xxxxx
Files not found /safd/xxxxx
#
#Reports
#
Error-Number 123
Error Number 12345
#

나에게 필요한 것은 "객체 목록"을 새 파일로 파이프하는 awk입니다.

#List of Objects
#
# Headers
# Paths
Files not found /var/xxxxx
Files not found /etc/xxxxx
Files not found /mnt/xxxxx
Files not found /safd/xxxxx
#  

"보고서"를 다른 파일에 넣으십시오.

#Reports
#
Error-Number 123
Error Number 12345
#

"첫 번째" #까지 #List of Objects + 3줄과 일치합니다.

보고서에도 동일하게 적용됩니다. #Reports + 1줄을 "첫 번째" #까지 일치시킵니다.

처음에는 다음과 같은 것을 시도했습니다.

awk '/#List of Objects/,/#Reports/'

다음 개체 목록의 경우:

awk '/#Reports/,0'

EOF까지 #Reports에서 데이터를 가져옵니다.

그러나 개체의 #Reports#List개체는 선택 사항이고 모든 입력 파일에 포함되어 있지 않기 때문에 #Reports를 "END-Pattern"으로 사용할 수 없습니다. 따라서 #과 일치해야 하지만 일치하는 패턴 다음에 처음 X번 나타나는 #은 무시합니다.

답변1

Awk script:

extract_pat_space.awk콘텐츠:

$0 ~ "^#" pat{ f = 1; hash = 0 }
f { print }
NF == 1 && $1 == "#"{ 
    if (++hash == 2) { f = hash = 0 }
}

사용법(두 모드 모두):

$ awk -f extract_pat_space.awk -v pat="List" file > list_of_objects.txt
$ awk -f extract_pat_space.awk -v pat="Reports" file > reports.txt

결과:

$ cat list_of_objects.txt 
#List of Objects
#
# Headers
# Paths
Files not found /var/xxxxx
Files not found /etc/xxxxx
Files not found /mnt/xxxxx
Files not found /safd/xxxxx
#

$ cat reports.txt 
#Reports
#
Error-Number 123
Error Number 12345
#

답변2

awk '
    /#List of Objects/ {f = "objects.txt"} 
    /#Reports/         {f = "reports.txt"} 
    f                  {print > f}
' file

키 헤더 중 하나가 표시되면 출력 파일 이름을 설정합니다.
변수가 설정된 경우 이 파일로 인쇄하십시오.

관련 정보