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: Rodrigo Boechat
Subject: Re: [shell-script] Comparando registros.
Date: Mon, 05 Mar 2012 13:17:56 -0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.2) Gecko/20120216 Thunderbird/10.0.2

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]



reply via email to

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