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.
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
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
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
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&/'
Para sabermos quantas palavras existem em nossa seleção, usamos wc
:
$ cat palavras.txt | grep pli | wc -l
> 382
Agora, em outro exemplo, vamos listar os arquivos em um diretório qualquer:
$ 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}'
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
Top comments (0)