Artigos

Prompt do Linux: stdin, stdout, stderr e seus truques (parte II)

No último artigo, vimos o conceito destes três streams que o Linux disponibiliza para comunicação entre programas e com o usuário. Agora, vamos à parte prática do negócio: mais exemplos e alguns comandos que podem tornar a vida muito mais fácil no shell. Vamos lá?

Obs.: para um melhor entendimento deste artigo, leia o anterior: Prompt do Linux: stdin, stdout, stderr e seus truques (parte I).

Ponha tudo numa linha só

O nosso amigo pipe (aquele “caninho” vertical: | ) pode ser uma tremenda mão na roda em alguns casos.

Suponha que você está com sua partição /home cheia, e você quer descobrir quem são os 10 usuários mais “fominhas”, classificado do maior para o menor, com números em megabytes, e ainda por cima, quer mandar esta relação por e-mail. Não existe comando que faça tudo isto numa tacada só; o jeito é concatenar a saída de um programa (stdout) com a entrada de outro (stdin):

# du -m --max-depth=1 /home | sort -rn | head -n 11 | mail -s "Usuários fominhas" meu_email@provedor.com.br

Não vou explicar parâmetro por parâmetro, senão isto aqui vai ficar enorme. Mas resumindo, a primeira parte (du -m --max-depth=1 /home) obtém uma lista com os totais ocupados por cada pasta dentro do /home, sem exibir as subpastas, e mostra os totais em megabytes; a segunda parte (sort -rn) classifica a relação obtida em ordem reversa, e tratando números como números (não como texto, que é o padrão); a terceira parte (head -n 11) pega as 11 primeiras linhas desta relação (11 porque a primeira vai ser o total geral); e por fim, o último comando pega esta relação e a manda por e-mail (você precisa ter o envio de e-mails instalado e configurado).

Vai pra lá, vai pra cá…

No último artigo, havia falado do write (>). Acontece que eu esqueci de mencionar que há o inverso também, no caso, “<" A função é parecida, porém, com a mudança de direção, obviamente muda-se o sentido em que as coisas devem ser digitadas, e o jeito de aplicá-lo também. Por exemplo: os comandos cat teste | sort e sort < teste fazem basicamente a mesma coisa: lêem o arquivo "teste" e o classificam em ordem alfabética. Só que no segundo caso, eu estou passando como entrada do programa um arquivo, quando no primeiro, o que eu passei foi a saída de um comando. Lembre-se: depois do "<", o que deve vir é um nome de um arquivo, jamais um comando. E há ganho de performance nisto: a segunda sintaxe é cerca de 3x mais rápida do que a primeira. A diferença pode ser imperceptível ao executar o comando uma vez, mas se for executado várias e várias vezes, dá para se notar.

Comandos úteis

Agora que você entendeu o conceito básico (sim, há muito mais conteúdo pra quem quer se aprofundar...), aí vão vários comandos legais para se trabalhar desta forma. Alguns deles vão merecer destaque especial aqui no Guia, pois são extremamente úteis em vários cenários.

      cat / tac: o primeiro abre um arquivo e o mostra na tela (stdout); o segundo faz o mesmo, mas mostra o arquivo de trás para frente.
      sort: classifica a entrada em ordem alfabética ou numérica (-n), crescente ou descrescente (-r).
      nl: numera as linhas.
      wc: conta os caracteres (-c), as palavras (-w) ou as linhas (-l).
      head: mostra as primeiras linhas. O número pode ser definido com -n.
      tail: mostra as últimas linhas. O número pode ser definido com -n.
      grep / egrep / fgrep: pesquisador de expressões regulares, usado para encontrar padrões dentro de um texto. Este aqui vai merecer atenção especial no Guia.
      cut: demilita a entrada por um separador (-d), e permite pegar campos específicos (-f). Pense nele como o seu amigo para quando você tiver um arquivo com linhas no estilo "dado1:dado2:dado3", e você precisar pegar apenas um ou alguns destes dados, que no caso, estão delimitados por dois pontos.
      awk: semelhante ao acima, porém muito mais poderoso. Quando eu aprender a trabalhar com ele direito, eu faço um artigo no Guia :)
      tr: substitui ou deleta caracteres, e também pode deletar repetidos.
      sed: equivalente ao comando acima, porém muito mais flexível e poderoso. Este aqui vai merecer atenção especial no Guia.
      tee: copia a saída para um arquivo.

Alguns comandos podem ficar meio obscuros agora; eu pretendo voltar neles quando for falar de shell scripts, mas antes, pretendo falar sobre expressões regulares (base do comando grep), pois este cara é importante. Sugiro que você pratique estes comandos com alguns arquivos de teste e leia seus respectivos manuais (man nomedocomando), para ir pegando o jeito. Tem quem ache que aprender este tipo de coisa é bobagem, mas eu garanto, estes comandos podem ser a sua salvação em muitos casos, especialmente o grep.

Semana que vem tem mais. Por ora, faça seus comentários abaixo, se desejar, ou acesse o Fórum do Guia para tirar dúvidas com os outros participantes. Até mais!

Tags: Linux, Software

Você também vai gostar

Leia também!