Pipelines
A partir desta edição iniciaremos uma série de dicas exemplificadas de como usufruir o máximo do poder da linha de comando do Linux.
Imagine que seu chefe (nada nervoso), peça a você uma lista de usuários cadastrados atualmente no seu servidor. Como você faria para construir esse relatório no menor tempo possível? Aqui vai um exemplo.
Todos nós sabemos que a lista de usuários cadastrados no Linux fica em um arquivo tipo texto no diretório /etc, cujo nome é passwd.
Para aqueles que não conhecem a formatação do arquivo, segue a instrução abaixo: cada linha do arquivo passwd é um registro de um usuário cadastrado, neste registro possuímos algumas informações vitais do usuário separadas pelo caractere ":" (dois-pontos). Exemplo no quadro abaixo.
Se o arquivo é do tipo texto e já possui todos os dados do usuário, fica fácil. É só fornecer este arquivo, certo? Certo, mas se o seu chefe pedir um relatório que possua a seguinte formatação:
LOGIN -> DESCRICAO
Aí precisaríamos desenvolver um pequeno aplicativo para ler o arquivo e formatar a saída conforme a nossa necessidade, certo? Errado! Com o poder da linha de comando do Linux podemos fazer esse relatório em segundos conhecendo o mínimo ou até mesmo nada de programação. Para isso vamos utilizar os PIPELINES. PIPELINES são uma seqüência de um ou mais comandos separados pelo caractere "|" (pipe). A saída-padrão do comando é conectada à entrada-padrão do próximo comando. Exemplo:
comando1 | comando2
Agora vamos ver isso na prática. Para listar o conteúdo do arquivo passwd utilizaremos o comando "cat" e para separar os campos usaremos o interpretador "awk". Essa não é a única maneira de extrair o relatório, portanto, use os comandos que você mais conhece.
cat /etc/passwd | awk -F":" {print $1"\t->\t",$5} |
root |
-> |
root |
bin |
-> |
bin |
daemon |
-> |
daemon |
adm |
-> |
adm |
lp |
-> |
lp
|
sync |
-> |
sync |
halt |
-> |
halt |
mail |
-> |
mail |
news |
-> |
news |
uucp |
-> |
uucp |
games |
-> |
games |
gopher |
-> |
gopher |
ftp |
-> |
FTP User |
nobody |
-> |
Nobody |
named |
-> |
Domain name server |
xfs |
-> |
X Font Server |
mysql |
-> |
MySQL server |
edison |
-> |
Edison Figueira Junior |
Olha que belo relatório! O comando awk recebe a saída-padrão do comando cat e a processa a cada linha recebida. A opção -F do awk é usada para informar o delimitador de cada campo. Separados os campos, podemos usar o print do awk para imprimir a saída conforme nossa necessidade.
Mas você entregaria esse relatório a seu chefe sem que ele estivesse indexado? Para indexar use o comando sort.
cat /etc/passwd | awk -F":" {print $1"\t->\t",$5} | sort
Porém, se o seu chefe precisar que o relatório seja indexado pelo campo de descrição, o que você faria?
cat /etc/passwd | awk -F":" {print $1"\t->\t",$5} | sort +2
A opção +2 no comando sort, especificada no comando acima, serve para indexar o resultado a partir da coluna 2 e separar por espaços.
Redirecione a saída do comando para um arquivo qualquer.
cat /etc/passwd | awk -F":" {print $1"\t->\t",$5} | sort +2 >relatorio.txt
Agora imagine que você precise alterar os direitos de todos os diretórios (somente os diretórios) que pertençam a um determinado usuário em todo o seu sistema de arquivos. Uma maneira simples de fazer isso é usar o comando:
find / -type d -user edison -exec chmod u-w {} \;
Nesse caso não estamos utilizando pipelines diretamente, mas sim um recurso do comando find, a opção -exec. Essa opção do find é interessante porque é possível executar qualquer comando utilizando como seu parâmetro o resultado de cada linha do find, que será substituído pelas chaves ({}).
Edison Figueira Jr.
efigueira@brc.com.br