TRABALHO EM PROGRESSO
A extração de dados é fácil:
awk '{ if($0~/DESCRIPTION/){getline;print $0}; if($0~/::=/) print $2}' testfile
A execução desse arquivo de teste que contém o texto de entrada que você publicou fornece essa saída:
$ awk '{if($0~/DESCRIPTION/){getline;print $0}; if($0~/::=/) print $2}' testfile
"Aspi: unable to read the file server hard disk might have problems"
124
"Aspi: database is corrupted"
125
Se vamos ter vários arquivos lá, o código pode ser editado da seguinte forma:
$ awk 'FNR==1{print FILENAME"\n========"} { if($0~/DESCRIPTION/){getline;print $0}; if($0~/::=/) print $2}' *.test
file1.test
========
"Aspi: unable to read the file server hard disk might have problems"
124
"Aspi: database is corrupted"
125
file2.test
========
"Aspi: second file"
134
"Aspi: i love awk"
135
Isso é apenas para extrair dados. Continuarei editando esta resposta para incluir como você pode atribuir dados extraídos a variáveis.
Uma abordagem é usar a função system
do awk, que permitirá executar comandos shell com variáveis passadas pelo awk. Nesta função, o comando deve estar entre aspas duplas e as variáveis internas do awk fora das aspas. Por exemplo, algo assim:
awk '{ if($0~/DESCRIPTION/){getline;printf $0"|"}; if($0~/::=/) printf $2"\n"}' *.test | awk -F'|' '{ STRING=$1;NUM=$2; system("echo this is the NUMBER "NUM" and this is the TEXT "STRING) }'
Saída:
this is the NUMBER 124 and this is the TEXT Aspi: unable to read the file server hard disk might have problems
this is the NUMBER 125 and this is the TEXT Aspi: database is corrupted
this is the NUMBER 134 and this is the TEXT Aspi: second file
this is the NUMBER 135 and this is the TEXT Aspi: i love awk
Uma forma possível de atribuir saída a variáveis seria com dois arrays parralel.
$ IFS="|"; STRING_ARRAY=($(awk ' /DESCRIPTION/ {getline;printf "%s|",$0}; /::=/ { printf $2"\n" }' trapfile.txt | awk -F'|' '{printf "%s|",$1}'))
$ echo ${STRING_ARRAY[*]}
"Aspi: unable to read the file server hard disk might have problems" "Aspi: database is corrupted" "Aspi: second file" "Aspi: i love awk"
Lá, usei o separador de campo interno IFS |
e criei a matriz de cadeias como processada pelos dois comandos awk. Agora que STRING_ARRAY pode ser usado em um loop for. Para gerar os números apropriados para uma matriz:
$ IFS="|"; NUMS_ARRAY=($(awk ' /DESCRIPTION/ {getline;printf "%s|",$0}; /::=/ { printf $2"\n" }' trapfile.txt | awk -F'|' '{printf "%s|",$2}'))
$ echo ${NUMS_ARRAY[*]}
124 125 134 135
Agora temos dois arrays parrallel, com cada string e número de correspondência de índice de cada ocorrência em qualquer arquivo
Note que o código no primeiro pipe é o mesmo, então podemos simplificar isso, fazendo um script awk:
#!/usr/bin/awk -f
# Author: SergKolo
# Date: June 16,2015
# Written for: http://askubuntu.com/q/636705/295286
# Awk script to extract text
# between two specific strings
# in a file
{
if($0~/DESCRIPTION/)
{
getline;printf "%s|",$0
};
if($0~/::=/) { printf $2"\n" }
}
Salve esse script em um arquivo com algum nome, chmod +x scriptname.awk
. Agora esses longos comandos simplificam como:
$ IFS="|"; LINES_ARRAY=($(trap-script.awk trapfile.txt | awk -F'|' '{printf "%s|",$1}' ))
e
$ IFS="|"; NUMBERS_ARRAY=($(trap-script.awk trapfile.txt | awk -F'|' '{printf "%s|",$2}' ))
Observação: porque, fora da nossa conversa nos comentários, ficou claro que alguns dos seus arquivos contêm linhas com %d
e %s
format, caracteres, e eu incluí printf "%s|",$0
gosta do código por um motivo. Quando a função printf expande uma linha $ 0 e vê esses caracteres de formato, assume que deve haver entrada para eles, em vez de tratá-los como uma cadeia longa. printf "%s|",$0
permite tratar esses caracteres% d como texto, não como algo que precisa de entrada.