![awk: 두 패턴 사이에 텍스트 + x 줄을 인쇄하고 첫 번째 일치 항목이 이어집니다.](https://linux55.com/image/135930/awk%3A%20%EB%91%90%20%ED%8C%A8%ED%84%B4%20%EC%82%AC%EC%9D%B4%EC%97%90%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%2B%20x%20%EC%A4%84%EC%9D%84%20%EC%9D%B8%EC%87%84%ED%95%98%EA%B3%A0%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%EC%9D%BC%EC%B9%98%20%ED%95%AD%EB%AA%A9%EC%9D%B4%20%EC%9D%B4%EC%96%B4%EC%A7%91%EB%8B%88%EB%8B%A4..png)
다음 입력 파일:
#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
키 헤더 중 하나가 표시되면 출력 파일 이름을 설정합니다.
변수가 설정된 경우 이 파일로 인쇄하십시오.