Como usar os comandos cat e tac do Linux

Arte de uma janela de terminal em um desktop Linux
Fatmawati Achmad Zaenuri / Shutterstock.com

Os  comandos cate tacexibem 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.

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 catentrou 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 catfazer hoje? Bastante, na verdade.

Exibindo um arquivo de texto

Para catlistar 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

cat poem1.txt em uma janela de terminal

O conteúdo do arquivo poem1.txt é mostrado na janela do terminal.

o conteúdo de poem1.txt em uma janela de terminal

Essa é apenas metade do famoso poema. Onde está o resto? Há outro arquivo aqui chamado poem2.txt. Podemos fazer catlistar 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

cat poem1.txt poem2.txt em uma janela de terminal

Isso parece melhor; temos o poema inteiro agora.

conteúdo de poem1.txt e poem2.txt em uma janela de terminal

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 catem lesse percorrer o texto em nosso próprio ritmo.

cat poem1.txt poem2.txt | Menos

cat poem1.txt poem2.txt |  menos em uma janela de terminal

Agora podemos avançar e retroceder no texto em um único fluxo, embora ele seja mantido em dois arquivos de texto separados.

Recomendado:  Não compartilhe seus jogos digitais com o Xbox de seu amigo

conteúdo de poem1.txt e poem2.txt em menos em uma janela de terminal

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 -nopção (número).

cat -n poem1.txt

cat -n poem1.txt em uma janela de terminal

As linhas são numeradas conforme são exibidas na janela do terminal.

conteúdo de poem1.txt com linhas numeradas em uma janela de 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

cat -b poem1.txt em uma janela de terminal

Agora as linhas de texto estão numeradas e as linhas em branco são ignoradas.

linhas numeradas pulando linhas em branco em uma janela de terminal

Não mostrar várias linhas em branco

Se houver seções de linhas em branco consecutivas em um arquivo, podemos pedir catpara ignorar todas, exceto uma linha em branco. Olhe para este arquivo.

conteúdo de um arquivo com linhas em branco consecutivas em uma janela de terminal

O próximo comando catmostrará 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

cat -b poem1.txt em uma janela de terminal

Isso não afeta o conteúdo do arquivo de forma alguma; apenas muda a maneira como cato arquivo é exibido.

Várias linhas em branco sendo ignoradas em uma janela de terminal

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

cat -T poem1.txt em uma viúva terminal

As guias são representadas pelos caracteres “^ I”.

conteúdo de poem1.txt com abas exibidas em uma janela de terminal

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

cat -T poem1.txt em uma janela de terminal

Os finais das linhas são representados pelo caractere “$”.

conteúdo de poem1.txt com finais de linha exibidos em uma janela de terminal

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

cat poem1.txt poem2.txt> jabberwocky.txt em uma janela de terminal

vamos usar catpara verificar nosso novo arquivo:

cat jabberwocky.txt

cat jabberwocky.txt em uma janela de terminal

Nosso novo arquivo contém o conteúdo dos outros dois arquivos.

conteúdo de jabberwocky.tx em uma janela de terminal

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

cat first_verse.txt >> jabberwocky.txt em uma janela de terminal

Vamos verificar o conteúdo do arquivo jabberwocky.txt:

cat jabberwocky.txt

cat jabberwocky.txt em uma janela de terminal

E, finalmente, todas as partes do poema estão juntas.

Recomendado:  X marca o ponto: Xbox da Microsoft completa 20 anos

conteúdo de jabberwocky.txt em uma janela de terminal

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

cat> my_poem.txt em uma janela de terminal

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

Doggerel de baixo grau em uma janela de terminal

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

tac my_poem.txt em uma janela de terminal

E o arquivo é listado na janela do terminal na ordem inversa. Nesse caso, não tem efeito em seus méritos literários.

my_poem.txt listado em ordem reversa em uma janela de terminal

Usando tac com stdin

Usar tacsem 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

tac trabalhando com stdin em uma janela de terminal

Quando Ctrl + D é pressionado, a entrada é revertida e listada na janela do terminal.

saída do tac usando stdin em uma janela de terminal

Usando tac com arquivos de log

Além de truques de salão de baixa qualidade, pode tacfazer 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 tacpara listar o arquivo syslog ao contrário e enviá-lo para head. Dizendo headpara 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

tac / var / log / syslog |  head -1 em uma janela de terminal

head imprime a entrada mais recente do arquivo syslog e depois sai.

Observe que headestá 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.

última entrada do syslog em uma janela de terminal

Usando tac com registros de texto

O último truque  tac na manga é uma beleza.

Normalmente, tacopera 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 tacpara 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

menos arquivo de log em uma janela de terminal

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.

Recomendado:  6 dicas para fazer seu Samsung assistir mais Google-y

topo do arquivo de log em uma janela de terminal

Se rolarmos até o final do arquivo, podemos ver que existem muitos desses registros. O último é numerado 865.

parte inferior do arquivo de log em uma janela de terminal

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

tac logfile.dat |  menos em uma janela de terminal

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.

arquivo de log invertido em menos em uma janela de terminal

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

tac -b -r -s ^ = SEQ. + [0-9] + * $ logfile.dat |  menos em uma janela de terminal

Vamos decompô-lo.

A -sopção (separador) informa  taco 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 -ropção (regex) diz tac para tratar a string separadora como uma expressão regular .

A -bopção (antes) faz taccom 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 -sstring (separador) ^=SEQ.+[0-9]+*$é decifrada da seguinte forma:

O ^personagem representa o início da linha. Isso é seguido por =SEQ.+[0-9]+*$. Isso instrui  taca 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.

arquivo de log invertido com registros de dados formados corretamente

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?”