O Shell Script é uma ferramenta muito poderosa na criação de scripts de automação. Mas não dá para fazer tudo apenas com Shell Script. Uma opção é encadear utilitários do terminal, como sed, awk e grep.
Pipe?
O pipe (do inglês tubo) serve para encadear processos no Linux.
O encadeamento se dá pela utilização do pipe (símbolo |). Você certamente já utilizou o pipe alguma vez na vida, só não sabia que tinha esse nome e como funcionava.
Exemplos
Os exemplos citados aqui podem parecer sem sentido. Servem, apenas, para ilustração. Existem outras maneiras, mais eficientes, de realizar a mesma tarefa!
Um exemplo simples mostra a contagem de arquivos em um diretório.
$ ls
cinco dois quatro tres um
$ ls | wc -l
5
O primeiro comando envia a saída do comando ls para a tela, o que é o normal. Já o segundo comando envia a lista de arquivos de um diretório, com o comando ls, para o utilitário wc, com a flag -l, que lista a quantidade de linhas de um arquivo. Como não foi passado nenhum arquivo, o wc utilizou a saída do comando ls.
Outro exemplo utilizando o comando cat:
$ cat arquivo.txt
Linha 1
Linha 2
Linha 3
$ cat arquivo.txt | wc -l
3
$ wc -l arquivo.txt
3 arquivo.txt
O primeiro comando exibe o conteúdo do arquivo arquivo.txt, o segundo exibe o conteúdo do arquivo e redireciona a saída para o comando wc e o terceiro comando exibe diretamente a quantidade de linhas do arquivo arquivo.txt.
Mais exemplos
Digamos que estamos criando um script que imprime uma lista de imagens jpg e documentos pdf do diretório atual. O comando ficaria assim:
$ ls | grep '\.jpg\|.pdf'
documento1.pdf
documento2.pdf
documento3.pdf
foto1.jpg
foto2.jpg
foto3.jpg
Também é possível utilizar expressões regulares:
$ ls | grep 'foto[[:digit:]]'
foto1.jpg
foto2.jpg
foto3.jpg
Dá para utilizar mais de um pipe. A quantidade depende do que você está querendo fazer. Cuidado para não abusar dos pipes!
Exemplos mais elaborados
A seguir um exemplo que captura o título de um site qualquer (no caso, o meu):
$ curl -s https://p0ng.com.br | grep '<title>' | cut -d'>' -f2 | cut -d'<' -f1
site do p0ng – Tecnologia e o resto
O que o comando acima faz é:
- Exibir o código-fonte do site (curl -s https://p0ng.com.br)
- De todo o texto impresso, apenas será exibido o que tiver a tag <title> (capturado pelo comando grep)
Saída: <title>site do p0ng – Tecnologia e o resto</title> - O comando cut recorta a linha, utilizando o caractere > como delimitador (-d ‘>’) e, a partir desse delimitador, imprimindo a segunda palavra encontrada (-f 2)
Saída: site do p0ng – Tecnologia e o resto</title - Mais uma vez, o comando cut recorta o que estiver antes do delimitador ‘<’
Saída: site do p0ng – Tecnologia e o resto
Outro exemplo bacana, dessa vez utilizando pipe e um redirecionador:
$ cat arquivo.txt
Linha 1
Linha 2
Linha 3
$ cat arquivo.txt | head -n 2 >> novo_arquivo.txt
$ cat novo_arquivo.txt
Linha 1
Linha 2
Explicando: o primeiro comando exibe o conteúdo do arquivo arquivo.txt, o segundo comando exibe o conteúdo do arquivo arquivo.txt e lista apenas as duas primeiras linhas do arquivo, redirecionando a saída para o arquivo novo_arquivo.txt (por isso não é exibido nada na tela). Já o terceiro comando exibe o conteúdo do arquivo novo_arquivo.txt, demonstrando que, agora, só existem duas linhas no arquivo.
Para conferir, basta utilizar o comando wc, que conhecemos anteriormente:
$ wc -l novo_arquivo.txt
2 novo_arquivo.txt
Conclusão
Com o pipe dá para fazer muita coisa em Shell Script. Aqui listei apenas exemplos básicos. Fica aqui, para uma leitura mais aprofundada, dois links: um falando sobre pipes e outro sobre redirecionamentos.
🙂