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

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

Re:[shell-script] Duvida


From: MrBiTs
Subject: Re:[shell-script] Duvida
Date: Fri, 26 Nov 2004 06:30:13 -0300

> Alguem ai me diz o significado desses comando:
> "diff -y"
> "--suppress-common-lines"
> " tr -d '\011' tr -d ' ' "
> Eu perguntei pra pessoa que me ajudou nesse script mas acho q ela
> noa ta online no momento... se alguem ai on line puder me dizer...
> agradeço

Pois é... depois que vc casa, fica meio complicado explicar para a esposa por 
que voce esta no computador e nao na cama às 23:48. É o preço que se paga por 
nao ser onipresente nem ter um motor de dobra para andar em Warp 10.

Vamos la: extraidos da fonte:

man diff nos diz que:

       diff - compara arquivos linha a linha

-y  --side-by-side
              Saida em duas colunas

--suppress-common-lines
              Nao mostra linhas em comum


Para uma melhor compreensao, desmembramos o comando: Entao, la naquele seu 
problema original, temos:

$ diff -y --suppress-common-lines frutas1.txt frutas2.txt
carambola                                                     | cagambola
cupuacu                                                       | cupuassu
manga                                                         | mango

O diff comparou os dois arquivos, o -y formatou a saida em duas colunas e o 
--suppress-common-lines mostrou somente onde os arquivos estao diferentes. O 
problema dessa saida é que ela esta formatada com tabs e espacos. 

Entao vem a segunda parte do comando

tr -d '\011' | tr -d ' ' 

De novo, direto da fonte: man tr nos diz que:

tr - traduz ou apaga caracteres

-d, --delete
              apaga caracteres, sem traduzi-los

entao, tr -d '\011' apaga o caracter octal TAB, que é o caracter gerado pelo 
pressionamento da tecla TAB e tr -d ' ' apaga os espacos.

Voce sabe que o | (pipe) "canaliza" a saida de um comando para o outro, certo ?
Entao, se eu faco 

diff -y --suppress-common-lines frutas1.txt frutas2.txt | tr -d '\011' | tr -d 
' ' 

estou dizendo ao sistema para comparar frutas1 e frutas2, mostrando somente os 
"registros dissonantes" ( Minority Report, alguem viu ??? ) em duas colunas. 
Pegue essa saida e  apague dela os TAB (\011) . Pegue essa segunda saida e 
apague dela os espaços. Dai vc tem  o resultado:

carambola|cagambola
cupuacu|cupuassu
manga|mango


Temos entao um caso tipico de registros delimitados. O nosso delimitador ai, 
chamado em alguns lugares de FS ( Field Separator ), é o |.

Como tenho 3 registros, esta ótimo para gerar um laco rapido, ler registro a 
registro e formatar essa saida do jeito que eu quero. Entao vem o laco for do 
script, atribuindo a uma variavel a linha carambola|cagambola. Vamos chama-la 
de $linha

echo $linha vai me mostrar exatamente o carambola|cagambola. Sabendo que o | ( 
comando de shell; nao confunda com o seu FS ) canaliza os resultados de um 
comando para outro, temos:

echo $linha | cut -d "|" -f 1

Estamos dizendo: ecoe, imprima o conteudo da variavel linha 
(carambola|cagambola) e corte-o pelo |, mostrando somente o campo 1, que me da 
carambola. Similarmente,

echo $linha | cut -d "|" -f 2 me devolve a palavra cagambola.

Acho que deu uma luz, nao foi ?

Dica de sucesso: sabendo agora que o | canaliza resultados, repita os comandos 
do script EM SEPARADO, para voce visualizar a saida e o que esta acontecendo 
durante o processamento.  Repita isso à exaustao, mas nao deixe de entender. E 
aproveite para ler as man pages do diff, do tr e de todos os comandos 
existentes em /bin, /sbin, /usr/bin e /usr/sbin e, eventualmente, os existentes 
em /usr/local/bin e /usr/local/sbin ( se existirem ). Man pages podem vir a ser 
suas melhores amigas. 

Depois de compreendida essa estrutura mais simplista, de comandos em separado, 
voce pode passar para o Lado Negro da Força, e fazer as magias negras que 
bruxos como o Julio e o Aurélio fazem.

Um abraço


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



reply via email to

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