DEV Community

Cover image for [pt-BR] Usando o shell além do básico
Plínio Balduino
Plínio Balduino

Posted on

[pt-BR] Usando o shell além do básico

Imagem: Hackerman, de shiiftyshift.

Tudo bem, talvez não sejam realmente indispensáveis, mas aprendê-las vai fazer com que você se sinta a própria Hackerperson.

Quando você lida com um sistema operacional compatível com POSIX (alguma variação de UNIX, BSD, Linux, MacOS X, etc), internamente existem dois canais principais para entrada e saída de dados: o stdin e o stdout. Existem mais, mas vamos focar nesses dois.

Um executável pode ler dados de stdin e gravar dados em stdout. Um exemplo disso acontecendo é quando o programa lê dados do teclado e grava, ou exibe, na tela.

O pulo do gato acontece quando você conecta o stdout de um programa com o stdin de outro usando um recurso chamado pipe (cano ou encanamento). O que um programa exibiria na tela passa a ser enviado para o stdin do programa seguinte, que processa aquelas entradas e devolve para o stdout. Você pode conectar inúmeros programas uns nos outros através do pipe, fazendo com que cada pecinha resolva uma parte do problema, transformado o dado e passando para o próximo.

O fundamento mais básico da computação

Para nosso exemplo, vamos baixar um arquivo com praticamente todas as palavras da Língua Portuguesa aqui.

Executando cat palavras.txt serão exibidas na tela as mais de trezentas e vinte mil palavras do arquivo. cat lê o arquivo e joga seu conteúdo para stdout, que neste caso é a própria tela.

Vamos usar o pipe para exibir o arquivo em ordem alfabética invertida usando sort:

$ cat palavras.txt | sort -r
Enter fullscreen mode Exit fullscreen mode

Agora, com o caracter de pipe, o |, direcionamos o conteúdo da saída padrão de cat para a entrada padrão de sort, exibindo assim o arquivo em ordem alfabética invertida.

Pode pode paginar a visualização do arquivo usando less e outro pipe:

$ cat palavras.txt | sort -r | less
Enter fullscreen mode Exit fullscreen mode

Pressione espaço para ir para a próxima página, ou Q para sair.

Vamos exibir apenas as palavras do dicionário que contenham o texto pli. Para isso usamos grep, que retorna apenas as entradas que contenham o texto informado:

$ cat palavras.txt | grep pli
Enter fullscreen mode Exit fullscreen mode

Sim, você pode usar grep palavras.txt pli também, mas a ideia aqui é encadear vários pipes para fins didáticos.

E vamos usar sed para deixar a primeira letra de cada palavra em maiúscula. sed aplica uma expressão regular na entrada e retorna o resultado:

$ cat palavras.txt | grep pli | sed 's/[a-z]/\U&/'
Enter fullscreen mode Exit fullscreen mode

Para sabermos quantas palavras existem em nossa seleção, usamos wc:

$ cat palavras.txt | grep pli | wc -l
> 382
Enter fullscreen mode Exit fullscreen mode

Agora, em outro exemplo, vamos listar os arquivos em um diretório qualquer:

$ ls -l
Enter fullscreen mode Exit fullscreen mode

ls -l
Perceba que os dados vieram exibidos em colunas. Para pegar o conteúdo de apenas uma das colunas, usamos awk, que usa uma linguagem própria com o mesmo nome. Os nomes dos arquivos estão na nona coluna. Então, para selecioná-la, passamos essa informação para o awk:

$ ls -l | awk '{print $9}'
Enter fullscreen mode Exit fullscreen mode

ls -l | awk '{print $9}'

Sim, você poderia ter usado file para isso, mas estou claramente inventando situações para poder demonstrar as ferramentas.

Por fim, vamos usar xargs, que pega os valores que chegam pelo stdin e passam como parâmetros para o comando seguinte. Por exemplo, vamos listar os arquivos e os conteúdos dos diretórios usando ls:

ls -l | awk '{print $9}' | xargs ls
Enter fullscreen mode Exit fullscreen mode

ls -l | awk '{print $9}' | xargs ls

Top comments (0)