Intereting Posts

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 # 

Это соответствует # Списку Объектов + 3 строки до “первого” #.

То же самое для отчетов: совпадение #Reports + 1 строка до “первого” #.

Сначала я попробовал что-то вроде:

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

За списком объектов следуют:

 awk '/#Reports/,0' 

Чтобы получить данные от #Reports до EOF.

Но поскольку #Reports и #List of Object являются необязательными и не во всех входных файлах, я не могу использовать #Reports в качестве «END-Pattern». Итак, я должен соответствовать на #, но игнорировать первые X вхождений # после соответствующего шаблона.

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 # 
 awk ' /#List of Objects/ {f = "objects.txt"} /#Reports/ {f = "reports.txt"} f {print > f} ' file 

Когда вы видите один из ключевых заголовков, установите выходное имя файла.
Если переменная была установлена, распечатайте в этот файл.