Copiando algumas partes do arquivo

-1

Devo copiar "O SNMP Agent está ativo" e ":: = 101" e contar o número de variáveis presentes (exemplo aqui há 5) e coloque-os em 3 variáveis diferentes.

FROM  FILE.TXT
sCSISmart1  TRAP-TYPE   
    ENTERPRISE  cyclone                        
    VARIABLES  { scellNameDateTime,                      
                     scellSWComponent,                     
                     scellECode,                  
                     scellCAC,                     
                     scellEIP}                           
    DESCRIPTION                             
    "SNMP Agent is up."                       
    --#TYPE "SNMP Agent is up."                    
    --#SUMMARY "SNMP Agent is up"                    
    --#ARGUMENTS {}                           
    --#SEVERITY INFORMATIONAL                       
    --#TIMEINDEX 100                  
    --#STATE OPERATIONAL                    
    --#HELP "scsismrt.hlp"                          
    --#HELPTAG 101                    
::=  101        

O que permanecerá constante em todos os outros arquivos

DESCRIPTION "  ";   
::= xxx(number);      
VARIABLES { variable1, variable2}

Qualquer comando SED, GREP, AWK ou qualquer outra coisa que eu possa usar aqui, tire isso do arquivo.txt

O que eu preciso é que eu encontre DESCRIÇÃO e copie o texto que vem depois. O mesmo para o número que eu encontro :: = e copio texto depois dele. Para a variável eu acho VARIABLE e encontro o número de variáveis depois disso.

Então, suponha que essas variáveis sejam desc é variável para DESCRIÇÃO
numvar é o número total de VARIABLES
casenum é o número que vem depois :: =

Então, quando eu imprimir essas variáveis acima, então

OUTPUT para o
variável desc

SNMP agent is up.

OUTPUT para o
variável numvar

5

OUTPUT para o
variável casenum

101

EDITAR
PARA NÃO VARIÁVEIS

sCSISmart2 TRAP-TYPE
ENTERPRISE cyclone
DESCRIPTION
"SNMP Agent is down."
--#TYPE "SNMP Agent is down."
--#SUMMARY "SNMP agent is down"
--#ARGUMENTS {}
--#SEVERITY INFORMATIONAL
--#TIMEINDEX 100
--#STATE OPERATIONAL
--#HELP "scsismrt.hlp"
--#HELPTAG 102
::= 102

PARA UMA VARIÁVEL

sCSISmart6 TRAP-TYPE
ENTERPRISE cyclone
VARIABLES {cycHostAdapterNumber}
DESCRIPTION
"The HostAdapter# %d has Failed"
--#TYPE "Host adapter failed"
--#SUMMARY "The HostAdapter# %d has Failed"
--#ARGUMENTS {0}
--#SEVERITY CRITICAL
--#TIMEINDEX 100
--#STATE OPERATIONAL
--#HELP "scsismrt.hlp"
--#HELPTAG 110
::= 110

    
por SamFlynn 15.06.2015 / 10:46

2 respostas

2

Possivelmente isso pode ser feito melhor. No entanto, isso pode ser feito usando esses 3 comandos:

desc="$(< inputfile awk '/DESCRIPTION/ {getline; sub(/^\s*"/, ""); sub(/"\s*$/, ""); print}')"
numvar="$(< inputfile awk '/VARIABLES/,/DESCRIPTION/ {count++}; END {if (count>0) print count-1; else print 0}')"
casenum="$(< inputfile awk '/::=/ {sub(/^\s*::=\s*/, ""); sub(/\s*$/, ""); print}')"
    
por kos 15.06.2015 / 11:05
2

EDITAR :

Crie um arquivo, chame como quiser e copie o script awk abaixo dele. chmod +x scriptname.awk para torná-lo executável.

#!/usr/bin/awk -f

BEGIN {var_num=0} 
/VARIABLES/,/}/ {
    sub("{","");
    sub("}","");
    sub("VARIABLES",""); 
    if ($0~/[[:alpha:]],/||/[[:alpha:]]/)var_num+=1
    }

 /DESCRIPTION/{ 
    getline; printf "%s,",$0
    } 
/::=/ {
    printf $2","
    }
END{ printf var_num }

Agora aqui está o meu exemplo de executar o script:

$ IFS=","; ARRAY=($(./three-lines.awk test-text.txt  | xargs echo ))                               
$ echo ${ARRAY[0]}; echo ${ARRAY[1]}; echo ${ARRAY[2]}                                             
SNMP Agent is up. 
101
5

Efetivamente, isso cria uma matriz de 3 elementos, e esses elementos são o que o awk script extrai de um arquivo. Regex [[: alpha:]] é usado para considerar sequências alfabéticas e seqüências alfabéticas com comas como variáveis, portanto var_num é incrementado; se não houver linhas que correspondam a esse padrão, var_num não é incrementado ORIGINAL

Aqui está o meu one-liner awk:

awk 'BEGIN {var_num=0} /VARIABLES/,/}/ {sub("{","");sub("}","");sub("VARIABLES",""); var_num+=1} END{ print var_num}' test-text.txt

Idéia básica: crie a variável var_num , diga ao awk para ler tudo entre as linhas que contêm VARIABLES string e chave retangular}. Livre-se dessa string, de todas as chaves e temos apenas strings que representam variáveis. Adicione 1 para cada linha a var_num . No final - imprima o total de variáveis contadas.

O motivo da exclusão de VARIABLES e chaves é que não queremos contar linhas que contenham apenas string VARIABLE ou a chave. Então, precisamos ter certeza de que eles foram embora.

Outro padrão que notei é que cada variável é separada por coma. Assim, você poderia usar uma instrução if, algo como if ($0~/,/) { var_num+=1 }

    
por Sergiy Kolodyazhnyy 15.06.2015 / 11:33