Integrando Shell Script com outros utilitários

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 &#8211; Tecnologia e o resto

O que o comando acima faz é:

  1. Exibir o código-fonte do site (curl -s https://p0ng.com.br)
  2. 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>
  3. 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
  4. 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.

🙂

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *