[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]
- Re:[shell-script] Duvida,
MrBiTs <=