Bash One Liners #1

Em: 17/06/2008 Tags: sort, awk, Bash Referencie do seu blog (Trackback)

Recentemente passei a trabalhar em um projeto que faz muito uso de Bash (ou Shell Script, o termo mais popular no Brasil). Passei, desde então, a prestar mais atenção em construções corriqueiras como um history | grep, descobrindo formas de resolver com diferentes programas baseados em linha de comando tarefas pequenas (ou não) do dia-a-dia. Esses programas (sort, grep, sed, awk, entre outros) tornam-se muito mais úteis, claro, quando podem ser combinados através de um pipeline. Quando conseguimos combinar programas Linux em 1 só comando compacto, acabamos de criar um programa one liner (de uma só linha).

É possível que esses programas funcionem em qualquer shell que você escolher (csh, ksh, entre outros), mas como há algumas diferenças na sintaxe dessas implementações, intitulei a série “Bash One Liners”, pois é apenas no Bash que as soluções serão testadas. Para saber que Shell você utiliza digite, num terminal:

echo $SHELL

Sem muita pretensão, irei publicar aqui no blog soluções one liners que criei (ou copiei) para resolver problemas no trabalho. Todos os artigos terão a mesma estrutura, que basicamente descreve o problema inicial, os programas utilizados na solução, e como a solução pode ser construída através de pipelines. Vamos ao primeiro!

Problema: tenho um arquivo com uma lista de nomes que eu gostaria de ordenar, colocando um asterisco à frente de cada linha, para formar uma “bulleted list”.

Solução inclui: sort e awk.

Exemplo: temos um arquivo types.txt com o seguinte conteúdo:

decimal
integer
float
datetime
date
timestamp
time
text
string
binary
boolean

Nossa transformação é feita em 2 passos. No primeiro ocorre a ordenação:

$ sort types.txt

Que devolve o texto na saída padrão como:

binary
boolean
date
datetime
decimal
float
integer
string
text
time
timestamp

Com um pipe podemos direcionar essa saída para a entrada do Awk, que irá imprimir cada linha precedida por um asterisco e um espaço em branco:

$ sort types.txt | awk '{print "* " $0}'
* binary
* boolean
* date
* datetime
* decimal
* float
* integer
* string
* text
* time
* timestamp

Problema resolvido!

Uma resposta para “Bash One Liners #1”

  1. Thânia Clair disse:

    Bem interessante. :) Aqui deu certo!! :D

Escreva um comentário (utilize o formato Markdown)