shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Comparando registros.


From: Valtoir
Subject: Re: [shell-script] Comparando registros.
Date: Wed, 29 Feb 2012 18:03:43 -0300

Boa tarde,

Salve o script a seguir, depois rode-o passando como parâmetro o arquivo de
registro. Ele deve criar um outro script chamado gerarray.sh com os
comandos para gerar os arrays.

Rode por sua conta e risco ;-)

---------------------------------------------------------------------
#/bin/bash
rm gerarray.sh
rm lixo
sed 's#\\#barra#g;/^$/d;s#=hex#=\"hex#' $1 >> lixo
while read linha; do
   if [ $(echo $linha | grep "^\[") ]; then
      chave=$(echo $linha | grep "^\[.*\]" | sed 's#\[##;s#]##')
      echo "declare -A $chave" >> gerarray.sh
   else
      echo $linha | grep -v "\"$" && linha=${linha}\"
      echo ${chave}$( echo ${linha} | sed 's#^\"#[#;s#\"#]#') >> gerarray.sh
   fi
done < lixo
chmod +x gerarray.sh

---------------------------------------------------------------------

Antes que esqueça, ele substitui as contrabarras das chaves de registro
pela string "barra", já que a contrabarra em si gera erro ao tentar criar
os arrays.

T+

Valtoir


Em 29 de fevereiro de 2012 11:41, Robson Alexandre <
address@hidden> escreveu:

> **
>
>
> Rodrigo,
> deixe-me fazer algumas considerações antes de expor meu ponto de vista.
> 1º Dormir pra quê, não é mesmo. Vc me manda msg as 4:05 da manhã de
> uma madrugada de sexta pra sábado (Deve ter chegado da balada e
> enviado o email.).
> 2º Acredito que seu arquivo exemplo veio com as quebras de linha
> desconfiguradas graças ao gmail.
> Assim fica minha dúvida:
> As chaves dos registros começam com [HKEY...] e termina com \n\n?
> Partindo deste princípio podemos aplicar esse sed :
>
> sed -n 's/\[/}\n\[/g;$s/$/\n}/;p' $REG | sed -n
> '/\[/{:inicio;/}/!{N;binicio};s/\n//g;s/}//g;p}'
>
> Então coloquei no pastebin do jeito que acho que a formatação do
> arquivoo de registro deve estar
> http://pastebin.com/YjQ5dQMi
>
> Acredito que deve haver solução mais simples, mas o fator tempo não
> deixou aperfeiçoar a solução.
> A partir dai vc pode colocar [Registro]=Atributos,Atributos da forma
> como vc achar conveniente.
> Eu estava esperando a solução com arrays, pois pretendo aplicá-la em
> outro problema, por exemplo quando vc tem um csv e pra cada campo
> separado por ; vc quer atribuir uma variavel deum vez só e não fazendo
> infinitos cut -f -d pra cada variavel.
> Bom, veja ai e diga-nos o que acha.
>
> Att
> Robson Alexandre
>
> Em 26 de fevereiro de 2012 15:19, Julio C. Neves
> <address@hidden> escreveu:
>
> > Se não conseguir implementar a dica do Alysson (de juntar tudo em uma
> > linha), outra coisa que vc poderia fazer seria:
> >
> > saida do comm | xargs -i grep -B2 {} arquivo
> >
> > Por falar em xargs, para juntar cada 3 linhas em uma (proposta do
> Alisson),
> > faça:
> >
> > cat arquivo | xargs -L3.
> > Abcs,
> > Julio
> > *Já foi lançado "Bombando o
> > Shell<
> http://www.brasport.com.br/index.php?dispatch=products.view&product_id=666
> >
> > ". *
> > *Show **de interfaces gráficas sob Shell!*
> > *
> > *
> >
> >
> >
> > Em 25 de fevereiro de 2012 20:44, Rodrigo Boechat <
> > address@hidden> escreveu:
> >
> >> **
> >>
> >>
> >> Júlio, boa noite!
> >> Obrigado pela resposta. Eu pensei nisso. Na verdade foi a primeira coisa
> >> que imaginei.
> >> Mas caí num caso que não atendeu, ou que meu conhecimento limitado não
> >> soube solucionar.
> >> O "comm" compara linha por linha e mostra a linha diferente.
> >>
> >> O problema é o seguinte, digamos que o registro no padrão esteja assim:
> >> [NOME\DA\CHAVE\00]
> >> "Atributo00"=dword:valor00
> >> "Atributo01"=dword:valor01
> >>
> >> Já no usado, tenho o seguinte:
> >> [NOME\DA\CHAVE\00]
> >> "Atributo00"=dword:VALOR10
> >> "Atributo01"=dword:valor01
> >>
> >> O registro "[NOME\DA\CHAVE\00]" é diferente entre o padrão e o usado,
> >> mas eu receberia apenas '"Atributo00"=dword:VALOR10' de retorno.
> >> A avaliação que preciso realizar, necessita do registro completo. Nesse
> >> caso, preciso do retorno:
> >>
> >> [NOME\DA\CHAVE\00]
> >> "Atributo00"=dword:VALOR10
> >> "Atributo01"=dword:valor01
> >>
> >> Como meu conhecimento ainda é limitado, você saberia resolver o caso sem
> >> usar arrays?
> >>
> >> - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
> >> -- -- -- -- -- -- -- -
> >> Fernando, boa noite!
> >> Obrigado pela resposta.
> >>
> >> Eu descobri isso tentando. Não entendi porque o shell não torna um
> >> elemento de array em array; matriz.
> >> mas já que a coisa é assim, eu pesquisei e já até tinha achado
> >> explicações sobre arrays associativos:
> >>
> >>
> >>
> http://www.dicas-l.com.br/cantinhodoshell/cantinhodoshell_20100120.php#.T0lbjl-oOCg
> >>
> >> Já conheço o meio de trabalhar com esse tipo de array, mas o que não
> >> consegui foi justamente, separar o registro e obter seus atributos em
> >> uma única linha.
> >>
> >> Aproveitando o exemplo que dei para o Júlio, tentarei explicar melhor.
> >> Registro padrão:
> >>
> >> [NOME\DA\CHAVE\00]
> >> "Atributo00"=dword:valor00
> >> "Atributo01"=dword:valor01
> >>
> >> chave='NOME\DA\CHAVE\00'
> >> atributo="\"Atributo00\"=dword:valor00\n\"Atributo01\"=dword:valor01"
> >> registroPadrao[$chave]=$atributo
> >>
> >> Eu não preciso, neste instante, saber especificamente o que está
> >> diferente na chave.
> >> Preciso apenas obter as chaves que possuem diferenças entre si.
> >>
> >> Assim fica super simples comparar as chaves do padrão com o usado, pois
> >> ambos possuirão os mesmos nomes de chaves.
> >> Eu faria algo assim:
> >>
> >> registroUsado[$chave] É IGUAL A registroPadrão[$chave]
> >>
> >> Se for diferente:
> >> echo $chave >> arquivoDeSaida.txt
> >> echo $atributos >> arquivoDeSaida.txt
> >>
> >> Meu problema é separar as chaves e colocar todos seus atributos como um
> >> único valor no elemento correto do array associativo.
> >> Tentei vários SEDs na busca pela resposta, mas só tive retorno toscos...
> >> =/
> >>
> >> Grato,
> >> Rodrigo Boechat
> >>
> >> Em 25-02-2012 18:05, Julio C. Neves escreveu:
> >> > Será que com o uso do diff ou do comm vc não resolve essa trapalhada
> em
> >> uma
> >> > linha somente?
> >> >
> >> > Abcs,
> >> > Julio
> >> > *Já foi lançado "Bombando o
> >> > Shell<
> >>
> http://www.brasport.com.br/index.php?dispatch=products.view&product_id=666
> >> >
> >> > ". *
> >> > *Show **de interfaces gráficas sob Shell!*
> >> > *
> >> > *
> >> >
> >> >
> >> >
> >> > Em 25 de fevereiro de 2012 04:05, Rodrigo Boechat<
> >> > address@hidden> escreveu:
> >> >
> >> >> **
> >> >>
> >> >>
> >> >> Pessoal, boa madrugada.
> >> >>
> >> >> Estou batendo cabeça com a seguinte situação:
> >> >> Tenho um arquivo de backup de registro do windows e preciso
> analisá-lo
> >> >> contra um registro "padrão" para verificar a diferença entre os dois.
> >> >>
> >> >> O que preciso e não estou conseguindo fazer é o seguinte: Pretendo
> criar
> >> >> um array "dicionário" com os nomes das chaves do registro e atribuir
> >> >> como valor todos os atributos das chaves em uma única linha.
> >> >>
> >> >> - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
> >> >> Exemplo de registro:
> >> >>
> [HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\MultifunctionAdapter\1]
> >> >> # REGISTRO
> >> >> "Component
> >> >> Information"=hex:00,00,00,00,00,00,00,00,00,00,00,00,ff,ff,ff,ff #
> >> ATRIBUTO
> >> >> "Identifier"="PCI"# ATRIBUTO
> >> >> "Configuration
> >> >> Data"=hex(9):05,00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,05,\#
> >> ATRIBUTO
> >> >> 00,00,00,04,00,00,00,00,00,00,00,00,00,00,00,02,10,01,01# ATRIBUTO
> >> >>
> >> >> [HKEY_LOCAL_MACHINE\HARDWARE\ACPI\FACS]# REGISTRO
> >> >>
> >>
> "00000000"=hex:46,41,43,53,40,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\#
> >> >>
> >> >> ATRIBUTO
> >> >>
> >> >>
> >>
> 00,00,00,00,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,00,00,\#
> >> >>
> >> >> ATRIBUTO
> >> >> 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00# ATRIBUTO
> >> >>
> >> >> [HKEY_LOCAL_MACHINE\HARDWARE\ACPI\FADT]# REGISTRO
> >> >> # ATRIBUTO
> >> >> [HKEY_LOCAL_MACHINE\HARDWARE\ACPI\FADT\VBOX__]# REGISTRO
> >> >> # ATRIBUTO
> >> >>
> >> >> - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
> >> >> Exemplo de resultado esperado:
> >> >> registros[NOME\COMPLETO\DO\REGISTRO]=TODAS AS LINHAS DE ATRIBUTOS
> >> >> AGRUPADAS NUMA SÓ, INCLUINDO AS LINHAS EM BRANCO.
> >> >>
> >> >> - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
> >> >> Ficou fácil de compreender?
> >> >>
> >> >> Eu pretendo carregar dois arrays, um com o registro padrão e outro
> com o
> >> >> "usado" para passar para um txt tudo que estiver diferente do padrão
> ou
> >> >> não existir no padrão.
> >> >> Acredito que eu consiga com um while, mas nem consegui criar os
> arrays
> >> >> ainda.
> >> >>
> >> >> Bom, eu tentei seguir a ideia de um SED sinistro que o Robson
> Alexandre
> >> >> passou:
> >> >>
> >> >> for cmd in INSERT SELECT DELETE UPDATE
> >> >> do
> >> >> sed -n "/${cmd}/{:a;/;/! {N;ba};s/\n/ /g;p}" arq.txt> "${cmd}.txt"
> >> >> done
> >> >>
> >> >> Não tive sucesso, embora eu já consiga compreender a estrutura.
> >> >>
> >> >> Alguém poderia me ajudar?
> >> >>
> >> >> Grato,
> >> >> Rodrigo Boechat
> >> >>
> >> >> [As partes desta mensagem que não continham texto foram removidas]
> >> >>
> >> >>
> >> >>
> >> >
> >> > [As partes desta mensagem que não continham texto foram removidas]
> >> >
> >> >
> >> >
> >> > ------------------------------------
> >> >
> >> > ----------------------------------------------------------
> >> > Esta lista não admite a abordagem de outras liguagens de programação,
> >> como perl, C etc. Quem insistir em não seguir esta regra será moderado
> sem
> >> prévio aviso.
> >> > ----------------------------------------------------------
> >> > Sair da lista: address@hidden
> >> > ----------------------------------------------------------
> >> > Esta lista é moderada de acordo com o previsto em
> >> http://www.listas-discussao.cjb.net
> >> > ----------------------------------------------------------
> >> > Servidor Newsgroup da lista: news.gmane.org
> >> > Grupo: gmane.org.user-groups.programming.shell.brazil
> >> >
> >> > Links do Yahoo! Grupos
> >> >
> >> >
> >> >
> >>
> >> [As partes desta mensagem que não continham texto foram removidas]
> >>
> >>
> >>
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> >
> >
> > ------------------------------------
> >
> > ----------------------------------------------------------
> > Esta lista não admite a abordagem de outras liguagens de programação,
> como perl, C etc. Quem insistir em não seguir esta regra será moderado sem
> prévio aviso.
> > ----------------------------------------------------------
> > Sair da lista: address@hidden
> > ----------------------------------------------------------
> > Esta lista é moderada de acordo com o previsto em
> http://www.listas-discussao.cjb.net
> > ----------------------------------------------------------
> > Servidor Newsgroup da lista: news.gmane.org
> > Grupo: gmane.org.user-groups.programming.shell.brazil
> >
> > Links do Yahoo! Grupos
> >
> >
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]