Eu tenho um script bash que possui uma matriz de nomes de banco de dados, conecte-se a cada um deles e execute um procedimento armazenado neles. Eu preciso obter valores da saída do procedimento armazenado e usá-los no restante do script. muitas das saídas são assim:
CONDBAT= 10000 MDBAT= 400 ADBAT= 143 QUEDBAT= 167924 INADBAT= 0
então notei que alguns bancos de dados têm saída diferente sem espaço:
CONDBAT=4000 MDBAT=1200 ADBAT=263 QUEDBAT=7924 INADBAT=0
Eu preciso pegar o valor depois do QUEDBAT e armazená-lo como uma variável. meu problema é que não consigo obter o valor para ambas as saídas. Eu tentei muitos comandos. por exemplo:
grep -Eo 'QUEDBAT=([[:space:]]+[^[:space:]]+){1}'
grep -vE -e 'QUEDBAT=[[:space:]]{4}' -e '^[^[:space:]]*$'
grep -oP '(?<=QUEDBAT\=)(\s+)?\K([^ ]*)'
mas eles não retornarão o valor para ambas as saídas. como posso obter o valor após o QUEDBAT ignorando qualquer espaço?
Não consigo escrever scripts separados porque preciso de todas as saídas para todos os bancos de dados em um script. toda vez que eu executo o procedimento armazenado, os valores serão alterados, então você não pode ter certeza de que os valores de cada parte terão 3 ou 4 dígitos. e também não consigo obter o que está entre =
e ADBAT
porque às vezes a ordem da saída não será a mesma.
+
é um ou mais . Você precisa*
de zero ou mais :Ou:
Ou use a coisa real (o
P
/p
naqueles acima são paraperl
) para portabilidade:(ou escreva todo o seu script no
perl
qual provavelmente será mais apropriado se for principalmente sobre processamento de texto).Sempre que sua entrada tiver pares tag = valor, acho melhor primeiro criar uma matriz para armazenar esses mapeamentos (
f[]
) abaixo e, em seguida, você pode obter os valores que desejar em qualquer ordem de entrada, compará-los, reordená-los etc. apenas suas etiquetas. Usando qualquer awk em qualquer shell em cada caixa Unix, isso faz o que você pediu especificamente:mas usando essa abordagem de construir o array de valor de tag primeiro, você pode fazer muito mais, por exemplo:
tr+ sed
pipeline pode ser usado onde on-line os campos separados "=".GNU sed
autônomo também pode ser usado.Resultado:
Usando
awk
para iterar sobre os campos, e quando encontrar o campo desejado, examine o próximo. Se estiver vazio => tivemos,QUEDATA= xxxx
então precisamos imprimir o segundo do atual, caso contrário, o próximo. Em seguida, incrementamos o contador de índice de campo para que não reexaminemos o campo next/next+1.resultado