[SHELL SCRIPT] enumere linhas de output com um pipe & grep

Inaugurando as postagens xDICA,

que vem com vídeos e conhecimento free, as in free beer as long as in freedom of course.

Deguste!

Utilidade pública. Missão: agilizar com atitude a competência geral do Universo.

Utilize expressões regulares e trate seu input/output com destreza.
Com essa dica você pode agilizar e deixar seus scripts menos suscetíveis a erros.
Enumere as linhas de output e force um delimitador com isso, : e o número da linha.
Desta forma você pode se referir a cada registro de output de um pipe simples,
como uma entidade única e ainda garantir que não haja erros. Por exemplo: se você já experimentou dar um ls em um pen-drive cheio de arquivos nojentos FAT32, sabe que um monte de mp3 por exemplo estará sujeita a ter nomes escrotos com espaços que fodem qualquer for VARIAVEL in $( ls -1 /mnt/PENDRIVEohNoes ) ou xargs, coitados, jamais sabem que os espaços meramente não são o delimitador. Vai dar erro, vai dar pau, não vai funcionar e você vai se frustrar. Vai acabar movendo e renomeando tudo na mão quando na verdade uma ÚNICA linha de shell resolveria. Enfim. Bora usar o computador ecologicamente de modo a facilitar a nossa vida e bem-estar? Ou vamos só gastar energia elétrica?

Bora então construir nosso pipe.

Pensando num universo delimitado por LINHAS, utilize o GREP para enumerá-las e o sinal de dois pontos (:) para delimitá-las. Saca só:

ls -1 | egrep '*$' -n

outputz:

1:Desktop
2:NORTHCOM norad.rsa

Uau, o arquivo com espaços está listado apenas em sua própria linha e sua “id” é 2. Isto porque usamos o grep -n que é a opção de numerar as linhas desse jeito lindo de Deus.

Agora podemos manipular o output, inclusive, tornando-as strings fechadas por aspas simples , que não gerarão erro.

( ls -1 | egrep '*$' -n )

| while read LINE; do LINE=$( echo $LINE | cut -d\: -f2- ); echo \'$LINE\' | sed 's/\ /\\ /g'; done

outputz:

'Desktop'
'NORTHCOM\ norad.rsa'

Faça depois o que você quiser. Você tem agora suas strings delimitadas, seguras e felizes.
Mude o delimitador pra qualquer coisa, adicione output em todas as linhas, etc, teste com um IF a “id” enfim, acho que essa dica gerará mais dicas por isso ela é a dica number one. Experimente um xargs. Experimente um FOR. Vai tudo funfar, meu amigo! Top dica, porra, o lance nesse site é BINário, tá sabendo?! rs

Pois esta dica na verdade é isto: use sua criatividade! Liberdade tem a ver com uma postura positiva.

Substitua “$1” por alguns comandos e note se o troço te serve pra algo. /etc/bashrc é bem útil tbm para criar aliases, por exemplo . . . mas isso fica pra outra estória!

‘cause “UNIX! I know this system…” (Jurassic Park, 1994?)

( ls -1 | egrep '*$' -n )

|

while read LINE; do LINE=$( echo $LINE | cut -d\: -f2- ); echo \'$LINE\'; done

Trate os espaços fazendo substituições com sed. Que o assunto da dica de amanhã.

Abraços! [ ] s

Deixe um comentário