awk: imprime texto entre dois padrões + x linhas seguidas por primeira correspondência

2

Seguindo o arquivo de entrada:

#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
#

O que eu preciso é de um awk que canalize a "Lista de Objetos" para um novo arquivo:

#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
#  

E os "Relatórios" em um arquivo diferente:

#Reports
#
Error-Number 123
Error Number 12345
#

É uma correspondência para #List of Objects + 3 linhas até "first" #.

O mesmo para os relatórios: Corresponder #Relatórios + 1 linha até "primeiro" #.

No começo eu tentei algo como:

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

Para a lista de objetos seguidos por:

awk '/#Reports/,0'

Para obter os dados de #Reports até EOF.

Mas como #Reports e #List dos objetos são OPCIONAIS e não em todos os arquivos de entrada, não posso usar #Reports como "END-Pattern". então, eu tenho que coincidir com o # mas ignorar as primeiras ocorrências X de # após o padrão de correspondência.

    
por T-One 27.06.2018 / 16:15

2 respostas

1

Awk script:

extract_pat_space.awk conteúdo:

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

Uso (para ambos os padrões):

$ 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

Resultados:

$ 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
#
    
por 27.06.2018 / 16:37
1
awk '
    /#List of Objects/ {f = "objects.txt"} 
    /#Reports/         {f = "reports.txt"} 
    f                  {print > f}
' file

Quando você vir um dos cabeçalhos principais, defina o nome do arquivo de saída.
Se a variável foi definida, imprima para esse arquivo.

    
por 27.06.2018 / 18:47

Tags