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:31:58 -0300

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]



reply via email to

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