[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"
- Re: [shell-script] listar arquivos grandes, (continued)
- Re: [shell-script] listar arquivos grandes, Julio C. Neves, 2008/07/13
- [shell-script], Marlon Vagner Reck, 2008/07/13
- Re: [shell-script], Julio C. Neves, 2008/07/13
- Re: [shell-script], Marlon Vagner Reck, 2008/07/13
- Re: [shell-script], Julio C. Neves, 2008/07/14
- Re: [shell-script], Guilherme Gall, 2008/07/14
- Re: [shell-script], Julio C. Neves, 2008/07/14
- Re: [shell-script], Julio C. Neves, 2008/07/14
- Re: [shell-script],
Tiago Barcellos Peczenyj <=
- [shell-script] Agradecendo, marlon_mca, 2008/07/18
- Re: [shell-script] listar arquivos grandes, alexandre, 2008/07/15