Como usar o comando wc no Linux

Laptop Linux mostrando um prompt do bash

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

Qual é o comando wc?

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

Você pode descrever o que ele faz em poucas palavras. 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 wcrealmente começa a agregar valor.

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

Uma maneira que uso wcé como espaço reservado em um comando complicado ou alias que estou criando. Se o comando finalizado tiver potencial para ser destrutivo e excluir arquivos, costumo usá-lo wccomo substituto do comando real e perigoso.

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

Por mais simples que wcseja, ainda existem algumas pequenas peculiaridades que você precisa conhecer.

Primeiros passos com banheiro

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

wc lorem.txt

Usando wc com um arquivo com uma longa linha de texto

Isso faz com wcque o arquivo seja digitalizado e contado as linhas, palavras e bytes e gravado na janela do terminal.

Palavras são consideradas qualquer coisa delimitada por espaços em branco. Se são palavras de uma língua real ou não, é irrelevante. Se um arquivo contiver apenas “frd g lkj”, ele ainda contará como três palavras.

Linhas são sequências de caracteres terminadas por um retorno de carro ou pelo final do arquivo. Não importa se a linha é contornada no seu editor ou na janela do terminal, até wcencontrar um retorno de carro ou o final do arquivo, ainda é a mesma linha.

Recomendado:  Como impedir que o Aero Shake minimize o seu Windows

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 wco interpreta.

wc lorem2.txt

gato lorem2.txt

Usando wc com um arquivo com muitas linhas

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

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

Podemos passar quantos arquivos wcquisermos.

wc lorem.txt lorem2.txt

Usando wc com dois arquivos

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

Também podemos usar curingas para 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, wcexibirá as linhas, palavras e bytes em cada arquivo. É o mesmo que usar as opções -l(linhas) -w(palavras) e (bytes).-c

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 ao último valor, gerado pela -copção (bytes). Muitas pessoas confundem isso com a contagem dos caracteres. Na verdade, conta bytes. O número de caracteres e o número de bytes podem muito bem ser os mesmos. Mas não sempre.

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

gato unicode.txt

O conteúdo de um arquivo contendo um caractere não latino

Possui três palavras e um caractere do alfabeto não latino. Vamos wcprocessar o arquivo com sua configuração padrão de bytes e faremos isso novamente, mas solicitaremos caracteres com a -mopção (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 (canônica) hexdumpdo comando -Cexibe 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 final ” .” será mostrado.

Recomendado:  Arch Linux x Ubuntu: qual você deve usar?

hexdump -C unicode.txt

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

Em ASCII, um valor hexadecimal 0x20representa 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, esses três primeiros valores 0x62, 0x6fe 0x79representam as letras de “menino”.

Pulando sobre 0x20, vemos outro conjunto de três valores hexadecimais: 0x63,, 0x61e 0x74. Isso significa “gato”. Pulando para o próximo caractere de espaço, vemos mais três valores para as letras em “cachorro”. Estes são 0x64, 0x5fe 0x67.

Logo atrás da palavra “cachorro” podemos ver um caractere de espaço 0x20e 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 colocamos em verde. É um caractere Unicode e são necessários três bytes para codificá-lo. Estes são 0xe1, 0xafe 0x8a.

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

Tirando nomes de arquivos de um arquivo

Há outra maneira de fornecer nomes de arquivos para arquivos 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 armazenar uma coleção arbitrária de nomes de arquivos para reutilização.

Mas há uma pegadinha, e é grande. Os nomes dos arquivos devem ter terminação nula e não terminação com retorno de carro. Ou seja, após cada nome de arquivo deve haver um byte nulo 0x00em vez do byte de retorno de carro usual  0x0a.

Você não pode abrir um editor e criar um arquivo com este formato. Normalmente, arquivos como este 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-loless mostra os estranhos ^@caracteres ” ” lessusados ​​para indicar bytes nulos.

menos lista de arquivos de origem.txt

Um arquivo em less que contém bytes nulos

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

Recomendado:  Como personalizar o Centro de controle no Mac

wc ---files0-from = lista de arquivos de origem.txt

wc processando o arquivo de nomes de arquivos terminados em nulo

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

Entrada de tubulação para wc

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

echo "Conte isso para mim" | Banheiro

echo -e "Conte isso\npara mim" | Banheiro

Usando echo para enviar entrada para wc

O segundo echocomando usa a -eopção (caracteres de escape) para permitir sequências de escape como o \ncódigo de formatação de nova linha ” “. Isso injeta uma nova linha, fazendo com que  wca entrada seja vista como duas linhas.

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

encontrar ./* -type f | rev | corte -d'.' -f1 | rev | classificar | único

  • find procura 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 classifica-os 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 em quaisquer subdiretórios.

Se adicionarmos a -copção (contar) ao uniqcomando, ele 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 o último comando da linha e usar a -lopção (linhas).

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

Adicionando wc para contar as extensões exclusivas

E finalmente

Aqui está um último truque wcque pode fazer por você. Ele lhe dirá o comprimento da linha mais longa em um arquivo. Infelizmente, ele não informa qual linha é. Apenas fornece o comprimento.

wc -L taf.c

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

Porém, tenha cuidado, pois as guias são contadas como oito espaços. Visto em meu editor, há três guias de dois espaços no início dessa linha. Seu comprimento real é de 124 caracteres. Portanto, o número relatado é ampliado artificialmente.

Eu trataria essa função com uma pitada de sal. E com isso quero dizer não use. 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.