Como usar os comandos cat e tac do Linux

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 cumprir sua parte no trabalho pesado quando se trata de trabalhar com arquivos.

O comando gato

gato está acostumado a examine o conteúdo dos arquivos de textoe juntar partes de arquivos para formar um arquivo maior.

Ao mesmo tempo – de volta à era do dial-up modem– 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 de volta cada arquivo menor. Se um único arquivo falhou ao baixar corretamente, você apenas recuperaria esse arquivo novamente.

Claro, 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 o gato entrou e de onde vem seu nome.

As conexões de banda larga e fibra fizeram com que essa necessidade específica diminuísse – da mesma forma que os sons de discagem barulhentos – então o que resta para o gato fazer hoje? Bastante, na verdade.

Exibindo um arquivo de texto

Para que cat liste 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 o 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; nós 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. Podemos canalizar a saída de cat para menos e rolar o texto para baixo em nosso próprio ritmo.

cat poem1.txt poem2.txt | less

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

  Como habilitar o login automático no Linux

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 opção -n (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 ter as linhas numeradas por gato, mas as linhas em branco entre os versos também estão sendo contadas. Para ter as linhas de texto numeradas, mas ignorar as linhas em branco, use a opção -b (número não em branco).

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 ao gato para ignorar todas, exceto uma linha em branco. Olhe para este arquivo.

O próximo comando fará com que o cat exiba 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 o gato exibe o arquivo.

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 os fins das linhas

Você pode verificar os espaços em branco finais usando a opção -E (mostrar extremidades).

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

cat poem1.txt poem2.txt> jabberwocky.txt em uma janela de terminal ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> vamos usar cat para verificar nosso novo arquivo: </p>
<pre> cat jabberwocky.txt </ pre > <p> <img src =

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 único>, 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 ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> Vamos verificar o conteúdo do arquivo jabberwocky.txt: </p>
<pre> cat jabberwocky.txt < / pre> <p> <img src =

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 > my_poem.txt

cat> my_poem.txt em uma janela de terminal ”largura =” 646 ″ altura = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> 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: </p>
<pre> cat my-poem.txt </pre>
<p> <img src =

Esse som como uma turbina distante é provavelmente Lewis Carroll girando em sua sepultura em alta velocidade.

O comando tac

tac é semelhante ao cat, mas lista o conteúdo dos arquivos Em ordem inversa.

Vamos ver isso:

tac my_poem.txt

E o arquivo é listado na janela do terminal na ordem reversa. Nesse caso, não tem efeito sobre 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 irá 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, o TAC pode fazer alguma coisa ú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 canalizá-lo para a cabeça. Dizendo ao head para imprimir apenas a primeira linha que receber (que graças ao tac é a última linha do arquivo), vemos a última entrada no arquivo syslog.

tac /var/log/syslog | head -1

head imprime a última entrada do arquivo syslog e então sai.

Observe que o cabeçote 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 que o tac tem na manga é uma beleza.

Normalmente, o 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 ao 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 menos.

less logfile.dat

Como podemos ver, o formato do arquivo se repete. Existem sequências de três linhas de hexadecimal valores. 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 algum motivo, precisamos trabalhar nesse arquivo em ordem reversa, registro de dados por registro. A ordem das três linhas hexadecimais em cada registro de dados deve ser preservada.

Notaremos 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 canalizá-lo para menos.

tac logfile.dat | less

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 | less

Vamos decompô-lo.

A opção -s (separador) informa ao tac o que queremos usar como delimitador entre nossos registros. Diz ao tac para não usar o caractere de nova linha usual, mas para usar o nosso separador.

A opção -r (regex) diz ao tac para tratar a string separadora como um expressão regular.

A opção -b (antes) faz com que o tac liste o separador 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 string -s (separador) ^ = SEQ. +[0-9]+ * $ é decifrado da seguinte forma:

O caractere ^ representa o início da linha. Isso é seguido por = SEQ. +[0-9]+ * $. Isso instrui o tac para procurar cada ocorrência de “= SEQ.” no início de uma linha, seguido por qualquer sequência de dígitos (indicada por [0-9]), e seguido por qualquer outro conjunto de caracteres (indicado por * $).

Estamos canalizando tudo para menos, 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 três últimas 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 isso faz uma coisa bem, e que interage facilmente com outros utilitários, deu origem a alguns pequenos comandos estranhos, como tac. À primeira vista, parece um pouco estranho. Mas quando você perscruta abaixo da superfície, há um poder inesperado que você pode aproveitar a seu favor.

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á dragão?”