Os comandos cat
e tac
exibem o conteúdo dos arquivos de texto, mas há mais do que aparenta. Mergulhe um pouco mais fundo e aprenda alguns truques produtivos de linha de comando do Linux.
Esses são dois pequenos comandos simples, muitas vezes descartados como sendo apenas isso – simples demais para ter alguma utilidade real. Mas depois de conhecer as diferentes maneiras de usá-los, você verá que eles são perfeitamente capazes de fazer sua parte justa no trabalho pesado quando se trata de trabalhar com arquivos.
Índice
O comando gato
cat
é usado para examinar o conteúdo de arquivos de texto e para juntar partes de arquivos para formar um arquivo maior.
Ao mesmo tempo – na era do modem dial-up – os arquivos binários costumavam ser divididos em vários arquivos menores para facilitar o download. Em vez de baixar um arquivo grande, você puxou cada arquivo menor. Se um único arquivo falhou ao baixar corretamente, você apenas recuperaria esse arquivo novamente.
Obviamente, você precisava de uma maneira de reconstituir a coleção de arquivos menores de volta no único arquivo binário de trabalho. Esse processo foi chamado de concatenação. E é aí que cat
entrou e de onde vem seu nome.
As conexões de banda larga e de fibra fizeram com que essa necessidade específica diminuísse – da mesma forma que os sons de discagem estridentes – então o que resta cat
fazer hoje? Bastante, na verdade.
Exibindo um arquivo de texto
Para cat
listar o conteúdo de um arquivo de texto em uma janela de terminal, use o seguinte comando.
Certifique-se de que o arquivo seja um arquivo de texto. Se você tentar listar o conteúdo de um arquivo binário na janela do terminal, os resultados serão imprevisíveis. Você pode acabar com uma sessão de terminal bloqueada ou pior.
cat poem1.txt
O conteúdo do arquivo poem1.txt é mostrado na janela do terminal.
Essa é apenas metade do famoso poema. Onde está o resto? Há outro arquivo aqui chamado poem2.txt. Podemos fazer cat
listar o conteúdo de vários arquivos com um comando. Tudo o que precisamos fazer é listar os arquivos em ordem na linha de comando.
cat poem1.txt poem2.txt
Isso parece melhor; temos o poema inteiro agora.
Usando gato com menos
O poema está todo lá, mas passou pela janela rápido demais para ler os primeiros versos. Nós podemos canalizar a saída de cat
em less
e percorrer o texto em nosso próprio ritmo.
cat poem1.txt poem2.txt | Menos
Agora podemos avançar e retroceder no texto em um único fluxo, embora ele seja mantido em dois arquivos de texto separados.
Numerando as linhas em um arquivo
Podemos fazer com que o cat numere as linhas do arquivo conforme são exibidas. Para fazer isso, usamos a -n
opção (número).
cat -n poem1.txt
As linhas são numeradas conforme são exibidas na janela do terminal.
Não numere linhas em branco
Conseguimos numerar as linhas por cat
, mas as linhas em branco entre os versos também estão sendo contadas. Para ter as linhas de texto numeradas, mas para ignorar as linhas em branco, use a opção -b
(número não vazio).
cat -b poem1.txt
Agora as linhas de texto estão numeradas e as linhas em branco são ignoradas.
Não mostrar várias linhas em branco
Se houver seções de linhas em branco consecutivas em um arquivo, podemos pedir cat
para ignorar todas, exceto uma linha em branco. Olhe para este arquivo.
O próximo comando cat
mostrará apenas uma linha em branco de cada grupo de linhas em branco. A opção de que precisamos para conseguir isso é a opção -s
(squeeze-blank).
cat -s poem1.txt
Isso não afeta o conteúdo do arquivo de forma alguma; apenas muda a maneira como cat
o arquivo é exibido.
Exibir guias
Se você quiser saber se o espaço em branco é causado por espaços ou tabulações, você pode descobrir usando a opção -T
(mostrar tabs).
cat -T poem1.txt
As guias são representadas pelos caracteres “^ I”.
Exibindo o Fim das Linhas
Você pode verificar se há espaços em branco à direita usando a opção -E
(mostrar termina).
cat -E poem1.txt
Os finais das linhas são representados pelo caractere “$”.
Arquivos de concatenação
Não faz sentido ter um poema salvo em dois arquivos, com uma metade em cada. Vamos juntá-los e fazer um novo arquivo com o poema inteiro nele.
cat poem1.txt poem2.txt> jabberwocky.txt
vamos usar cat
para verificar nosso novo arquivo:
cat jabberwocky.txt
Nosso novo arquivo contém o conteúdo dos outros dois arquivos.
Anexar texto a um arquivo existente
Isso é melhor, mas na verdade, não é o poema inteiro. O último verso está faltando. O último versículo em Jabberwocky é igual ao primeiro versículo.
Se tivermos o primeiro versículo em um arquivo, podemos adicioná-lo ao final do arquivo jabberwocky.txt e teremos o poema completo.
Neste próximo comando, temos que usar >>
, não apenas >
. Se usarmos um >
, sobrescreveremos jabberwocky.txt. Não queremos fazer isso. Queremos acrescentar texto ao final dele.
cat first_verse.txt >> jabberwocky.txt
Vamos verificar o conteúdo do arquivo jabberwocky.txt:
cat jabberwocky.txt
E, finalmente, todas as partes do poema estão juntas.
Redirecionando stdin
Você pode redirecionar a entrada do teclado para um arquivo usando cat
. Tudo o que você digita é redirecionado para o arquivo até que você pressione Ctrl + D. Observe que usamos um único >
porque queremos criar o arquivo (ou sobrescrevê-lo, se existir).
cat> meu_poem.txt
Podemos começar a digitar assim que emitirmos o comando. Apertamos Ctrl + D quando terminamos. Podemos então verificar o conteúdo do novo arquivo com:
cat my-poem.txt
Esse som como uma turbina distante é provavelmente Lewis Carroll girando em sua sepultura em alta velocidade.
O comando tac
tac
é semelhante a cat
, mas lista o conteúdo dos arquivos na ordem inversa .
Vamos ver isso:
tac my_poem.txt
E o arquivo é listado na janela do terminal na ordem inversa. Nesse caso, não tem efeito em seus méritos literários.
Usando tac com stdin
Usar tac
sem um nome de arquivo fará com que ele opere na entrada do teclado. Pressionar Ctrl + D interromperá a fase de entrada e o tac listará em ordem reversa tudo o que você digitou.
tac
Quando Ctrl + D é pressionado, a entrada é revertida e listada na janela do terminal.
Usando tac com arquivos de log
Além de truques de salão de baixa qualidade, pode tac
fazer algo útil? Sim pode. Muitos arquivos de log acrescentam suas entradas mais recentes na parte inferior do arquivo. Usando tac
(e, contra-intuitivamente head
), podemos colocar a última entrada na janela do terminal.
Usamos tac
para listar o arquivo syslog ao contrário e enviá-lo para head
. Dizendo head
para imprimir apenas a primeira linha que receber (que graças a tac
é a última linha do arquivo), vemos a última entrada no arquivo syslog.
tac / var / log / syslog | cabeça -1
head
imprime a entrada mais recente do arquivo syslog e depois sai.
Observe que head
está imprimindo apenas uma linha – conforme solicitamos – mas a linha é tão longa que se enrola duas vezes. É por isso que parecem três linhas de saída na janela do terminal.
Usando tac com registros de texto
O último truque tac
na manga é uma beleza.
Normalmente, tac
opera em arquivos de texto, percorrendo-os linha por linha, de baixo para cima. Uma linha é uma sequência de caracteres terminada por um caractere de nova linha. Mas podemos dizer tac
para trabalhar com outros delimitadores. Isso nos permite tratar “pedaços” de dados dentro do arquivo de texto como registros de dados.
Digamos que temos um arquivo de log de algum programa que precisamos revisar ou analisar. Vamos dar uma olhada em seu formato com less
.
menos logfile.dat
Como podemos ver, o formato do arquivo se repete. Existem sequências de três linhas de valores hexadecimais . Cada conjunto de três linhas hexadecimais tem uma linha de rótulo que começa com “= SEQ”, seguida por uma sequência de dígitos.
Se rolarmos até o final do arquivo, podemos ver que existem muitos desses registros. O último é numerado 865.
Vamos supor que, por qualquer motivo, precisamos trabalhar nesse arquivo na ordem inversa, registro de dados por registro de dados. A ordem das três linhas hexadecimais em cada registro de dados deve ser preservada.
Faremos uma observação que as três linhas finais do arquivo começam com os valores hexadecimais 93, E7 e B8, nessa ordem.
Vamos usar tac
para reverter o arquivo. É um arquivo muito longo, então vamos enviá-lo less
.
tac logfile.dat | Menos
Isso inverte o arquivo, mas não é o resultado que desejamos. Queremos que o arquivo seja revertido, mas as linhas em cada registro de dados devem estar em sua ordem original.
Registramos anteriormente que as três linhas finais do arquivo começam com os valores hexadecimais 93, E7 e B8, nessa ordem. A ordem dessas linhas foi invertida. Além disso, as linhas “= SEQ” agora estão abaixo de cada conjunto de três linhas hexadecimais.
tac
para o resgate.
tac -b -r -s ^ = SEQ. + [0-9] + * $ logfile.dat | Menos
Vamos decompô-lo.
A -s
opção (separador) informa tac
o que queremos usar como delimitador entre nossos registros. Ele diz tac
para não usar seu caractere de nova linha usual, mas para usar nosso separador.
A -r
opção (regex) diz tac
para tratar a string separadora como uma expressão regular .
A -b
opção (antes) faz tac
com que o separador seja listado antes de cada registro em vez de depois dele (que é a posição usual de seu separador padrão, o caractere de nova linha).
A -s
string (separador) ^=SEQ.+[0-9]+*$
é decifrada da seguinte forma:
O ^
personagem representa o início da linha. Isso é seguido por =SEQ.+[0-9]+*$
. Isso instrui tac
a procurar cada ocorrência de “= SEQ.” no início de uma linha, seguido por qualquer sequência de dígitos (indicado por [0-9]
) e seguido por qualquer outro conjunto de caracteres (indicado por *$
).
Estamos canalizando tudo less
, como de costume.
Nosso arquivo agora é apresentado em ordem reversa com cada linha de rótulo “= SEQ” listada antes de suas três linhas de dados hexadecimais. As três linhas de valores hexadecimais estão em sua ordem original em cada registro de dados.
Podemos verificar isso de forma simples. O primeiro valor das três primeiras linhas de hexadecimal (que eram as últimas três linhas antes de o arquivo ser revertido) correspondem aos valores que registramos anteriormente: 93, E7 e B8, nessa ordem.
Esse é um truque e tanto para um one-liner de janela de terminal.
Tudo tem um propósito
No mundo Linux, mesmo os comandos e utilitários aparentemente mais simples podem ter propriedades surpreendentes e poderosas.
A filosofia de design de utilitários simples que fazem uma coisa bem e que se relacionam facilmente com outros utilitários deu origem a alguns pequenos comandos estranhos, como tac
. À primeira vista, parece um tanto estranho. Mas quando você perscruta abaixo da superfície, há um poder inesperado que você pode usar em sua vantagem.
Ou, como outra filosofia diz, “Não desprezes a cobra por não ter chifres, pois quem pode dizer que ela não se tornará um dragão?”