Como recortar e colar em sistemas Unix

Como recortar e colar em sistemas Unix

UNIX cut and paste
Autor Original: Ladislav Bodnar
Fonte: http://distrowatch.com/weekly.php?issue=20080225#feature
Tradução: Lucas Rodrigues da Palma

Estive olhando o histórico de comandos no meu terminal, e acabei notando que entre os comandos que eu uso mais freqüentemente são o “cut” (recortar) e “paste” (colar). Para aqueles que estão iniciando no mundo UNIX, isso tem pouco haver com recortar e colar pedaços de textos com um mouse ou teclado à la Windows; ao invés disso, estes antigos comandos de UNIX foram feitos para extrair e reorganizar colunas de texto separadas por delimitadores. Vamos ver um exemplo. Se você está em um sistema Debian e roda o “dkpg -l” em um terminal, você vai ter uma lista completa dos pacotes instalados em seu sistema em forma de uma tabela. O fim do output deve estar parecido com isto:

dpkg-output
Como nós podemos ver, há quatro colunas de dados. A primeira, consistindo de dois caracteres, indicam o estado do arquivo (se ele foi instalado completamente, parcialmente removido, etc.), a segunda coluna lista o nome dos pacotes, a terceira suas versões, e a última possui uma descrição curta de cada pacote. Isso é muito texto para as minhas necessidades, então eu decidi reorganizar as colunas então elas iriam conter apenas o nome dos pacotes e as versões. Além disso, eu queria listar apenas os pacotes completamente instalados. Assim é como fazemos isso.

Primeiro, nós usamos o comando “grep” para filtrar todas as linhas que não começam com “ii”, então nós usamos o pipe (|) e o comando “grep” como abaixo:

dpkg -l | grep “^ii”

Agora, nós vamos começar usando o comando “cut“. Para isso, nós vamos especificar o delimitador, ou seja, qual caracter vai ser usado para cortar as colunas de texto do resto. Neste caso, o delimitador vai ser o caracter “espaço“, já que este é o caracter que precede imediatamente e imediatamente está em frente à segunda coluna. Para especificar o delimitador nós usamos a opção -d e separamos o caracter espaço com aspas simples ou duplas. Para especificar a coluna desejada nós usamos a opção -f (como há dois espaços antes da coluna com o nome do pacote, nós vamos recortar tudo antes do segundo caracter espaço e tudo depois do terceiro caracter espaço, incluindo eles próprios). Isso vai aumentar o comando anterior, como é mostrado abaixo:

dpkg -l | grep “^ii” | cut -d’ ‘ -f3

O resultado é uma longa lista com o nome dos pacotes e nada mais. Nós vamos salvá-la em um arquivo temporário com o caracter de redirecionamento de output (>):

dpkg -l | grep “^ii” | cut -d’ ‘ -f3 > temp1.txt

Você também pode cortar mais de uma coluna usando a opção -f da seguinte maneira: -f3-6. Se você estiver seguindo este breve tutorial em uma janela de terminal, tente mudar algumas variáveis (o delimitador, os números das colunas) para ter uma idéia de como cada alteração afeta o output.

Agora iremos isolar a terceira coluna, aquela que lista as versões dos pacotes. Isso é um pouco mais difícil pois o número de espaços entre a segunda e a terceira coluna pode variar dependendo do quão longo o nome do pacote é. Logo, nós não podemos usar o delimitador -d. Por sorte nós temos outra opção: a opção -b, a qual quer dizer número de bytes (ou um número de caracteres que você quer recortar da lista original). Nós usamos a opção -b desta maneira:

dpkg -l | grep “^ii” | cut -b 46-

O comando acima vai cortar tudo do começo de cada linha até o 46º caracter. Em outras palavras, ele vai mostrar o texto do 46º caracter em diante. O problema aqui é que não sabemos exatamente onde a terceira coluna começa (isso depende de muitos fatores, incluindo a largura da sua janela de terminal), então você ou vai ter que contar os caracteres para determinar o começo ou você pode fazer alguns testes com diferentes variáveis (46, 50, 54, etc.) para encontrar o valor correto. Você também vai querer cortar tudo depois do número da versão dos pacotes, o que podemos fazer com outro pipe usando outro comando “cut“:

dpkg -l | grep “^ii” | cut -b 46- | cut -d’ ‘ -f1

Finalmente, nós salvamos o resultado em um arquivo temporário:

dpkg -l | grep “^ii” | cut -b 46- | cut -d’ ‘ -f1 > temp2.txt

Nós temos dois arquivos temporários de texto, ambos contendo o mesmo número de linhas.

Nós podemos agora combiná-los em um arquivo usando o comando “paste“:

paste -d^ temp1.txt temp2.txt

Aqui eu usei o circunflexo (^) como delimitador, mas você pode usar qualquer caracter que desejar. (O circunflexo é ótimo, porque ele raramente é usado em algum lugar, então ele pode ser usado como um delimitador quase que universal. Durante anos eu sempre usei o o circunflexo como delimitador de colunas em meus arquivos de texto 😉 ). O resultado final deve parecer com algo assim:

dpkg-output2

Agora, como tarefa de casa, por favor use o pipe no comando acima para cortá-lo de um modo que ele remova todo o texto depois do hífen (-). (Sim, eu estou falando sério!)

É claro que você pode combinar todos esses comandos em uma só linha juntando-os usando o “&&” ou você pode criar um Bash script colocando cada comando em sua própria linha e fazer com que o script seja executável. A vantagem do Bash script é que você pode criar variáveis nele; no exemplo acima, você pode simplesmente substituir o número “46” com “$1”, então quando você executá-lo, você pode especificar o número correto como primeiro argumento do script.

Dando o exemplo acima que queria mostrar como flexível e rápido a linhas de comandos realmente são. Se você tentar fazer tudo acima em um documento, com certeza deve levar bem mais tempo para fazê-lo (os comandos acima vão ser completados antes mesmo que você consiga abrir seu OpenOffice.org Calc!), então aprendendo alguns comandos, você pode organizar algumas grandes colunas de dados com facilidade e elegância. Você também pode combinar o “cut” e o “paste” com outros comandos úteis, como o “uniq“, “sort“, “grep” e o “sed” para virtualmente mostrar qualquer coisa de qualquer arquivo de texto. De fato, eu percebi que extrair um exato pedaço de informação de um log de 600MB de Apache usando estes comandos não leva mais do que alguns segundos.

Se você trabalha freqüentemente com arquivos de dados e textos, gaste alguns minutos para aprender como se recorta e cola da maneira UNIX. Você vai perceber que você pode fazer muitas tarefas que pareciam complexas e que consumiam bastante tempo em alguns instantes.

Créditos à Ladislav Bodnar – http://distrowatch.com/weekly.php?issue=20080225#feature
Tradução por Lucas Rodrigues da Palma

Sobre o Autor

Redes Sociais:

Deixe seu comentário

X