Suponha que não quero que apareçam mais os comentários "#":
$ sed '/^#/d' /etc/protocols
ip 0 IP # internet protocol, pseudo protocol number
icmp 1 ICMP # internet control message protocol
igmp 2 IGMP # Internet Group Management
Observe que todas as linhas que se iniciavam com # foram deletadas.
Agora vamos substituir um padrão por outro, a sintaxe é bem simples s/padrão velho/padrão novo/. Observe o arquivo nomes.txt, vamos mudar o nome Amaral para Julia:
$ cat nomes.txt
Amaral
Suzan
Mariana
Wilson
Yan
$ sed -e 's/Amaral/Julia/' nomes.txt
Julia
Suzan
Mariana
Wilson
Yan
Imagine que se houvesse mais de uma ocorrência do nome Amaral poderíamos usar o parâmetro g para mudar todas elas. Então o comando ficaria assim:
$ sed -e 's/Amaral/Julia/g' nomes.txt
Agora vamos mudar o nome Amaral para Julia e depois deletar o nome Wilson tudo de uma vez:
$ cat nomes.txt |sed -e 's/Amaral/Julia/;/Wilson/d'
Julia
Suzan
Mariana
Yan
Podemos também usar padrões em combinação com números, vamos deletar a primeira linha até o nome Wilson:
$ sed '1,/Wilson/d' nomes.txt
Yan
Agora vamos mudar todas as letras a para % que aparecem nas três primeiras linhas:
$ sed -e '1,3s/a/%/g' nomes.txt
Am%r%l
Suz%n
M%ri%n%
Wilson
Yan
grep
Como sabemos, no
Linux, os padrões de pesquisa são chamados de expressões regulares. Para pesquisar um arquivo inteiro, isso na época dos primeiros sistemas Unix, o usuário prefixava o comando com global. E, uma vez que uma combinação era descoberta ela era listada na tela com o comando print. Para juntar toda a maçaroca de comandos, a operação indicada era global/regular expression/print. Como vemos a frase era longa e logo os usuários abreviaram para g/re/p e posteriormente acabou se tornando grep.
Existe uma quantidade enorme de opções que podemos usar, entre elas destacam-se:
- ^ Indica tudo que estiver no início.
- $ Indica tudo que estiver no fim.
Vamos listar somente os diretórios do /etc:
$ ls -l /etc | grep '^d'
drwxr-xr-x 3 root root 1024 May 31 09:38 CORBA
drwxr-xr-x 19 root root 1024 May 31 10:13 X11
drwxr-xr-x 2 root root 2048 May 31 13:31 alternatives
drwxr-xr-x 2 root root 1024 May 31 10:00 apache
Agora quero saber quantos arquivos .conf existem dentro do diretório /etc:
$ ls -R /etc | grep -c '.conf$'
107
Observe que ele achou 107 arquivos no diretório /etc. Vamos supor que eu preciso saber somente quais são os nomes existentes no arquivo nomes.txt que começam com M, S e W.
$ grep [MSW] nomes.txt
Suzan
Mariana
Wilson
Nós podemos também pesquisar por faixa [0-9][a-zA-Z], observe:
$ grep [A-S] nomes.txt
Amaral
Suzan
Mariana
Agora vamos pesquisar todos os números de 1 a 3 dígitos iniciados por 1 no arquivo numeros.txt:
$ cat numeros.txt
102
32
1800
900
132
5600
33
9015
12
1486
$ cat numeros.txt | grep '\<[0-9]\{1,3\}\>' | grep '^1'
102
132
12
- [0-9] - Indica a faixa de caracteres que será pesquisada, ou seja, de 0 a 9.
- {1,3} - Indica a quantidade de dígitos que os números devem ter na pesquisa, ou seja, de 1 a 3 dígitos.
- ^1 - Indica somente os números iniciados com 1.
Como podemos observar, o
grep possui uma infinidade de opções para se obter o resultado desejado. Espero que com estes exemplos possa ter ajudado a comunidade Linux.