Como usar o comando wc no Linux

Publicados: 2022-07-23
Laptop Linux mostrando um prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Contar o número de linhas, palavras e bytes em um arquivo é útil, mas a flexibilidade real do comando wc do Linux vem do trabalho com outros comandos. Vamos dar uma olhada.

O que é o comando wc?

O comando wc é um pequeno aplicativo. É um dos principais utilitários do Linux, portanto, não há necessidade de instalá-lo. Ele já estará no seu computador Linux.

Você pode descrever o que ele faz em poucas palavras. Ele conta as linhas, palavras e bytes em um arquivo ou seleção de arquivos e imprime o resultado em uma janela de terminal. Ele também pode receber sua entrada do fluxo STDIN, o que significa que o texto que você deseja processar pode ser canalizado para ele. É aqui que o wc realmente começa a agregar valor.

Como usar Pipes no Linux
RELACIONADO Como usar Pipes no Linux

É um ótimo exemplo do mantra do Linux de “faça uma coisa e faça bem”. Como ele aceita entrada canalizada, pode ser usado em encantamentos de vários comandos. Como veremos, este pequeno utilitário autônomo é na verdade um ótimo jogador de equipe.

Uma maneira de usar wc é como um espaço reservado em um comando complicado ou alias que estou preparando. Se o comando finalizado tiver o potencial de ser destrutivo e excluir arquivos, geralmente uso wc como substituto do comando real e perigoso.

Dessa forma, durante o desenvolvimento do comando recebo um feedback visual de que cada arquivo está sendo processado como eu esperava. Não há chance de algo ruim acontecer enquanto estou lutando com a sintaxe.

Por mais simples que seja o wc , ainda existem algumas pequenas peculiaridades que você precisa conhecer.

Introdução ao wc

A maneira mais simples de usar wc é passar o nome de um arquivo de texto na linha de comando.

 wc lorem.txt 

Usando wc com um arquivo com uma longa linha de texto

Isso faz com que wc escaneie o arquivo e conte as linhas, palavras e bytes, e os grave na janela do terminal.

Palavras são consideradas qualquer coisa limitada por espaços em branco. Se são palavras de uma linguagem real ou não, é irrelevante. Se um arquivo não contiver nada além de “frd g lkj”, ele ainda contará como três palavras.

As linhas são sequências de caracteres terminadas por um retorno de carro ou pelo final do arquivo. Não importa se a linha é enrolada em seu editor ou na janela do terminal, até que wc encontre um retorno de carro ou o final do arquivo, ainda é a mesma linha.

Nosso primeiro exemplo encontrou uma linha em todo o arquivo. Aqui está o conteúdo do arquivo “lorem.txt”.

 gato lorem.txt 

O conteúdo do arquivo com uma linha longa

Tudo isso conta como uma única linha porque não há retornos de carro. Compare isso com outro arquivo, “lorem2.txt”, e como o wc o interpreta.

 wc lorem2.txt
 gato lorem2.txt 

Usando wc com um arquivo com muitas linhas

Desta vez, wc conta 15 linhas porque os retornos de carro foram inseridos no texto para iniciar uma nova linha em pontos específicos. No entanto, se você contar as linhas com texto, verá que são apenas 12.

As outras três linhas são linhas em branco no final do arquivo. Estes contêm apenas retornos de carro. Mesmo que não haja texto nestas linhas, uma nova linha foi iniciada e então wc as contamos como tal.

Podemos passar quantos arquivos quisermos para o wc .

 wc lorem.txt lorem2.txt 

Usando wc com dois arquivos

Obtemos as estatísticas para cada arquivo individual e um total para todos os arquivos.

Também podemos usar curingas para que possamos selecionar arquivos correspondentes em vez de arquivos nomeados explicitamente.

 wc *.txt *.? 

Usando wc com curingas

As opções de linha de comando

Por padrão, wc exibirá as linhas, palavras e bytes em cada arquivo. É o mesmo que usar as opções -l (linhas) -w (palavras) e -c (bytes).

 wc lorem.txt
 wc -l -w -c lorem.txt 

Usando wc com as opções de linhas, palavras e bytes

Podemos especificar qual combinação de figuras desejamos ver.

 wc -l lorem.txt

wc -w lorem.txt

wc -c lorem.txt

wc -l -c lorem.txt 

Usando wc com combinações de opções

Atenção especial deve ser dada à última figura, gerada pela opção -c (bytes). Muitas pessoas confundem isso com a contagem dos caracteres. Na verdade, ele conta bytes . O número de caracteres e o número de bytes podem ser os mesmos. Mas não sempre.

Vejamos o conteúdo de um arquivo chamado “unicode.txt”.

 cat unicode.txt 

O conteúdo de um arquivo que contém um caractere não latino

Tem três palavras e um caractere do alfabeto não latino. Vamos deixar wc processar o arquivo com sua configuração padrão de bytes , e faremos isso novamente, mas solicitamos caracteres com a opção -m (caracteres).

 wc unicode.txt
 wc -l -w -m unicode.txt 

Contando os bytes em um arquivo e depois contando os caracteres no mesmo arquivo

Existem mais bytes do que caracteres.

Vamos dar uma olhada no dump hexadecimal do arquivo e ver o que está acontecendo. A opção -C (canônica) do comando hexdump exibe os bytes no arquivo em linhas de 16, com seu equivalente ASCII simples (se houver) mostrado no final da linha. Se não houver nenhum caractere ASCII correspondente, um ponto “ . ” é mostrado em vez disso.

 hexdump -C unicode.txt 

Um hexdump de um arquivo curto com um caractere não latino

Em ASCII, um valor hexadecimal de 0x20 representa um caractere de espaço. Se contarmos três valores a partir da esquerda, veremos que o próximo valor é um caractere de espaço. Portanto, os três primeiros valores 0x62 , 0x6f e 0x79 representam as letras em “boy”.

Passando sobre o 0x20 , vemos outro conjunto de três valores hexadecimais: 0x63 , 0x61 e 0x74 . Estes soletram “gato”. Passando pelo próximo caractere de espaço, vemos mais três valores para as letras em “cachorro”. Estes são 0x64 , 0x5f e 0x67 .

Logo atrás da palavra “cachorro” podemos ver um caractere de espaço 0x20 e mais cinco valores hexadecimais. Os dois últimos são retornos de carro, 0x0a .

Os outros três bytes representam o caractere não latino, que circundamos em verde. É um caractere Unicode e são necessários três bytes para codificá-lo. Estes são 0xe1 , 0xaf e 0x8a .

Portanto, certifique-se de saber o que está contando e de que bytes e caracteres não precisam ser os mesmos. Normalmente, contar bytes é mais útil porque informa o que está realmente dentro do arquivo. Contar por caracteres fornece o número de coisas representadas pelo conteúdo do arquivo.

RELACIONADO: O que são codificações de caracteres como ANSI e Unicode e como elas diferem?

Tirando nomes de arquivos de um arquivo

Há outra maneira de fornecer nomes de arquivos para wc . Você pode colocar os nomes dos arquivos em um arquivo e passar o nome desse arquivo para wc . Ele abre o arquivo, extrai os nomes dos arquivos e os processa como se tivessem sido passados ​​na linha de comando. Isso permite que você armazene uma coleção arbitrária de nomes de arquivos para reutilização.

Mas há uma pegadinha, e é grande. Os nomes de arquivo devem ser terminados com nulo , não com retorno de carro terminado. Ou seja, após cada nome de arquivo deve haver um byte nulo de 0x00 em vez do usual byte de retorno de carro 0x0a .

Você não pode abrir um editor e criar um arquivo com este formato. Normalmente, arquivos como esse são gerados por outros programas. Mas, se você tiver esse arquivo, é assim que você o usaria.

Aqui está nosso arquivo contendo os nomes dos arquivos. Abri-lo em less mostra os estranhos caracteres “ ^@ ” que less usa para indicar bytes nulos.

 menos source-files-list.txt 

Um arquivo em menos que contém bytes nulos

Para usar o arquivo com wc , precisamos usar a --files0-from (ler entrada de) e passar o nome do arquivo que contém os nomes dos arquivos.

 wc ---files0-from=source-files-list.txt 

wc processando o arquivo de nomes de arquivos terminados em nulo

Os arquivos são processados ​​exatamente como se fossem fornecidos na linha de comando.

Entrada de tubulação para wc

Uma maneira muito mais comum, flexível e produtiva de enviar entrada para wc é canalizar a saída de outros comandos para wc . Podemos demonstrar isso com o comando echo .

 echo "Conte isso para mim" | banheiro
 echo -e "Conte isso\npara mim" | banheiro 

Usando echo para enviar entrada para wc

O segundo comando echo usa a opção -e (caracteres com escape) para permitir sequências com escape como o código de formatação de nova linha “ \n ”. Isso injeta uma nova linha, fazendo com que wc veja a entrada como duas linhas.

Aqui está uma cascata de comandos alimentando suas entradas de um para o outro.

 localizar ./* -tipo f | rev | corte -d'.' -f1 | rev | classificar | único
  • find procura por arquivos ( type -f ) recursivamente, começando no diretório atual. rev inverte os nomes dos arquivos.
  • cut extrai o primeiro campo ( -f1 ) definindo o delimitador de campo como um ponto “ . ” e lendo da “frente” do nome do arquivo invertido até o primeiro ponto encontrado. Agora extraímos a extensão do arquivo.
  • rev reverte o primeiro campo extraído.
  • sort os classifica em ordem alfabética crescente.
  • uniq lista entradas exclusivas para a janela do terminal.

A lista de extensões exclusivas na árvore de diretórios atual

Este comando lista todas as extensões de arquivo exclusivas no diretório atual e quaisquer subdiretórios.

Se adicionarmos a opção -c (count) ao comando uniq , ela contaria as ocorrências de cada tipo de extensão. Mas se quisermos saber quantas extensões de arquivo diferentes e exclusivas existem, podemos descartar wc como o último comando da linha e usar a opção -l (linhas).

 localizar ./* -tipo f | rev | corte -d'.' -f1 | rev | classificar | único | wc -l 

Adicionando wc para contar as extensões exclusivas

RELACIONADO: Como usar o comando de corte do Linux

E finalmente

Aqui está um último wc que podemos fazer por você. Ele lhe dirá o comprimento da linha mais longa em um arquivo. Infelizmente, não diz qual é a linha. Apenas lhe dá o comprimento.

 wc -L taf.c 

Obtendo o comprimento da linha mais longa em um arquivo com wc

Cuidado, porém, que as guias são contadas como oito espaços. Visto no meu editor, há três guias de dois espaços no início dessa linha. Seu comprimento real é de 124 caracteres. Assim, o número relatado é expandido artificialmente.

Eu trataria esta função com uma grande pitada de sal. E com isso quero dizer não usá-lo. Sua saída é enganosa.

Apesar de suas peculiaridades, wc é uma ótima ferramenta para usar comandos canalizados quando você precisa contar todos os tipos de valores, não apenas as palavras em um arquivo.

RELACIONADO: 37 comandos importantes do Linux que você deve conhecer