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: Mon, 5 Mar 2012 13:48:29 -0300

Opa,

Por acaso o erro não ocorre quando o registro é um hex? Se for, isso ocorre
porque registros hex não são gravados entre aspas. Por isso aquela linha

sed 's#\\#barra#g;/^$/d;s#=hex#=\"hex#' $1

Detalhe: a linha acima só coloca as aspas no início do registro :-P, as
aspas finais, no exemplo que te dei, são colocadas naquele else lá embaixo.
Chamo essa técnica de e-gop, sigla para Extreme Gambiarra Oriented
Programming. Ela não deve ser usada, estava com pressa quando escrevi. O
ideal é usar o mesmo sed pra colocar as aspas finais.

Alguém da lista com mais experiência em sed consegue te ajudar com isso
(adequar o sed acima pra também colocar as aspas no final da linha).

Vai repassando tuas experiências aí, o assunto me parece interessante. De
qualquer forma, a (tentativa de) solução que te passei é meio maluca, mas
talvez dê pra extrair alguma coisa dela,

T+

Valtoir
Em 5 de março de 2012 13:17, Rodrigo Boechat <
address@hidden> escreveu:

> **
>
>
> Júlio,
> Obrigado pela resposta.
>
> O arquivo original não tem apenas duas ou três linhas de atributos,
> abaixo do nome da chave.
> Tem chave com 10 atributos...
> Gostei da sua linha super simples, mas pra mim ficou complexo usá-la
> numa situação dessas.
> Também, em testes não consegui comparar os arquivos com um registro por
> linha.
>
> - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
> Alysson,
> Obrigado pela resposta.
>
> No consegui usar o "diff" para comparação de linhas, somente o "comm".
> talvez tenha sido meu cansaço mental... Bem. Você poderia citar um
> exemplo com "diff" para criar o arquivo 3.txt com conteúdo que há em
> 2.txt que não existe em 1.txt?
>
>
> - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
>
> Robson,
> Obrigado pela resposta.
>
> 1) Não é bem por aí... Eu trabalho em turno de revesamento.
> Quando estou de 00h~08h, levo meu note para o trampo para ajudar passar
> o tempo.
> As vezes jogo, as vezes fico "shelleando", as vezes fico automatizando
> planilhas de excel para o povo do adm... Essas coisas. ^_^"
>
> 2) Deu certo para o exemplo que passei, mas não para os arquivos de
> registro.
> Pesquisei e finalmente consegui entender o porque da bagaça não ter
> funcionado.
> Simples e complexamente, o raio do editor de registro do windows usa uma
> codificação de caractere diferente do ISO. Usa o "utf-16le" aí deu muito
> problema porque o as expressões com "^\[", por exemplo, não conseguiam
> encontrar as linhas que começavam com "[".
> Descobri esse comando abaixo:
> $ file -i antes.reg
> antes.reg: text/plain; charset=utf-16le
>
> Aí descobri como alterar a codificação de caractere:
> $ iconv --from-code=utf-16le --to-code=UTF-8 antes.reg -o antes.utf8.reg
>
> Foi realmente complexo chegar nesse ponto, porque até eu lembrar da
> possibilidade da codificação de caracteres, bati MUITA cabeça com
> códigos, e mais códigos, e pesquisas, e pesquisas...
> @_@
>
> Bem. No final das contas a solução de colocar as chaves e seus atributos
> em uma única linha, não deu certo.
> Infelizmente, quando executei o "comm" com os dois arquivos ele reclamou
> que os arquivos não eram ordenados.
> E até o dado momento, eu não consegui imaginar como ordenar igualmente
> os dois arquivos, visto que um arquivo possui, por exemplo:
> [A\MONTE\DE\COISA]
> [C\MONTE\DE\COISA]
>
> E o outro:
> [A\MONTE\DE\COISA]
> [B\MONTE\DE\COISA]
> [C\MONTE\DE\COISA]
>
> Desse jeito, mesmo usando o "sort" a coisa fica desordenada.
> :(
>
>
> - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
>
> Valtoir.
> Obrigado pela resposta!
>
> Bom. Baseado no script que você criou para gerar o array, fiz um script,
> mas quando eu o executo, ele apresenta erro nas linhas 31 e 41.
>
> http://pastebin.com/DkxY6a73
>
> $ ./diferencaRegistro.bash antes.reg usado.reg
> ./diferencaRegistro.bash: linha 31: registroPadrao["$chavePadrao"]:
> índice da matriz (array) incorreto
> ./diferencaRegistro.bash: linha 41: registroUsado[$chaveUsada]: índice
> da matriz (array) incorreto
>
> Até agora não consegui compreender o que eu fiz errado. E eu estou
> evitando ao máximo realizar testes, já que o "antes.reg" tem 30,8MB!!!!
> E o usado 40,2MB!!!! Olha que a única diferença de um pro outro é uma
> instalação do Office2007.
>
> Hoje no meu zero hora eu testarei o seu script e estudarei um jeito de
> aplicá-lo na comparação, caso o meu não tenha salvação.
>
> Grato a todos,
> Rodrigo Boechat
>
> Em 29-02-2012 18:31, Valtoir escreveu:
>
> > Mais uma coisa: para listar o conteúdo dos arrays, rode a linha abaixo:
> >
> > grep ^declare gerarray.sh | sed 's/declare -A /echo \$\{/;s/$/[@]}/'>>
> > gerarray.sh
> >
> > e depois rode o script gerarray.sh
> >
> > Valtoir
> >
> > Em 29 de fevereiro de 2012 18:03, Valtoir<address@hidden
> >escreveu:
> >
> >> 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]
> >
> >
> >
> > ------------------------------------
> >
> > ----------------------------------------------------------
> > 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]



reply via email to

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