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

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

Re: [shell-script]


From: Tiago Barcellos Peczenyj
Subject: Re: [shell-script]
Date: Tue, 15 Jul 2008 16:49:27 -0300

Marlon

o grep faz pesquisas *apenas* em fluxos de dados, ou seja, em arquivos
ou na entrada padrão

Se eu fizer isso (grep ana) e escrever "oi, boi e banana" em linhas
separadas, o grep vai repetir a palavra banana, pois o programa
encontrou uma ocorrência de "ana"

$ grep ana
oi
boi
banana
banana # esse o grep repete!!!

se vc tem uma string, ou seja, uma referência textual que *não* está
em arquivo (como um texto literal ou o conteudo de uma variavel) vc
tem varias opções:

1) posso criar um arquivo temporario com o texto banana

$ echo "banana" > /tmp/arquivo
$ grep ana /tmp/arquivo

2) passar via stdin com um pipe ou redirecionamento (eliminando
escrita em disco)

$ echo "banana" | grep ana
-- ou --
$ grep ana < /tmp/arquivo

3) posso criar um named pipe com o conteudo "banana"

$ grep ana <(echo "banana")

4) posso usar here document

$ grep ana <<PINDAMONHANGABA
banana
PINDAMONHANGABA

5) posso usar here strings

$ grep ana <<< "banana"

Perceba como as opções 1, 3 e 5 são semelhantes. O Bash oferece a
opção 5 como algo extremamente limpo (evitando um echo + caracteres
dificeis) do que as demais opções e vc está no shell pai em todas as
opções, exceto a numero 2.

Compreendido isso, agora vc precisaria estudar um pouco sobre exit
codes para compreender comandos encadeados como

$ ./configure && make && make install

O que pode ser feito com este exemplo

true && echo "sucesso $? " || echo "falha $?"
false && echo "sucesso $? " || echo "falha $?"

true e false são 2 comandos que simplesmente fazem um exit com codigo
0 ou 1. Se for 0 vc pode interpretar como saiu com sucesso, caso
contrario ocorreu uma falha.

pratique um pouco estes conceitos que vc domina. Shell é assim,
algumas ferramentas demoram pra 'cair a ficha' como o xargs e o find,
mas depois são extremamente uteis no dia a dia em um sistema
operacional decente :)


2008/7/13 Marlon Vagner Reck <address@hidden>:
>
> Obrigado a todos
>
> A parte do && e do grep -qs eu tinha entendido, minha dúvida é como ele
> conseguiu fazer o grep procurar uma palvra dentro de outra sem esta estar em
> um arquivo e sim em uma váriavel ou no final de um comando mas com a ajuda
> do
> Julio C. Neves eu entendi, agora o que me perturba é o comando do Julio (
> rindo de mim mesmo por não entender os comandos ):
>
> grep -qs $1 <<< "$2" && echo "$1 está contida em $2"
>
> a parte que não entendi é o que os " <<< " fazem de diferente de apenas um "
> < " , as váriaveis não estão todas no mesmo shell ?
>
> Em Sunday 13 July 2008 21:18:51 Julio C. Neves escreveu:
>> Fala Marlon,
>> a opção -q (quiet) do grep serve para não jogar na stdout a linha em que
>> existia a cadeia
>>
>> $ grep ^root /etc/passwd && echo achei
>> root:x:0:0:root:/root:/bin/bash
>> achei
>> $ grep -q ^root /etc/passwd && echo achei
>> achei
>>
>> a opção -s é para não mandar erro para a saída caso vc não tenha direito
>> de
>> leitura ou o arquivo não exista (o grep não dá erro qdo não encontra a
>> cadeia pesquisada). Veja:
>>
>> $ grep julio nãoexiste
>> grep: nãoexiste: Arquivo ou diretório inexistente
>> $ grep -s julio nãoexiste
>> $
>>
>> Então a opção -qs significa silêncio total e stdout e stderr. Experimente
>> tb fazer assim:
>>
>> # passando parâmetros para o shell corrente
>> $ set - ana banana
>> # Será que funcionou?
>> $ echo $0
>> bash
>> $ echo $1
>> ana
>> $ echo $2
>> banana
>> # Blz! Então vamos ao que interessa
>> $ grep -qs $1 <<< "$2" && echo "$1 está contida em $2"
>> ana está contida em banana
>>
>> Assim vc escreve menos e é um pouquinho mais rápido pq não tem pipe para
>> fazer fork do shell
>> --
>> Abraços,
>> Julio
>> Em setembro estarei dando um treinamento
>> Shell em Brasília (em 2 fins de semana).
>> Mais informações: www.tecnologiabr.com.br
>> Tel: (61) 3354-3162
>>
>> 2008/7/13 Marlon Vagner Reck <address@hidden>:
>> > Amigos
>> >
>> > Comprei o livro "Shell script profissional " do Aurélio ( muito bom por
>> > sinal)
>> > e me deparei com a seguinte linha:
>> >
>> > echo $2 | grep -qs $1 && echo "$1 está contida em $2"
>> >
>> > que pesquisa dentro de uma palavra a existência de outra, exemplo ana
>> > dentro
>> > de banana. Só que eu não consegui entender de o funcionamento dela, o
>> > echo mostra a váriavel 2 digamos "banana" e joga no sub-shell para que o
>> > grep pesquise a váriavel 1 digamos "ana" dentro da palavra "banana",
>> > qual
>> > a mecânica da coisa a lógica?
>> >
>> > Obrigado a todos
>> > Marlon
>
> 



-- 
Tiago B Peczenyj
Linux User #405772

http://peczenyj.blogspot.com/
"what does not kill us makes us stronger"


reply via email to

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