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: Robson Alexandre
Subject: Re: [shell-script] Comparando registros.
Date: Wed, 29 Feb 2012 11:41:59 -0300

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
>
>


reply via email to

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