Linux / Comando wc: contar linhas, palavras, caracteres e bytes
wc é um comando que conta o número de linhas, palavras, bytes e caracteres em um arquivo ou entrada padrão. Quando executado sem opções, ele apresenta a quantidade de quebras de linha, palavras e bytes em ordem, e você pode escolher apenas os valores que precisa com -l, -w, -c e -m.
Os exemplos consideram Bash e ferramentas GNU; substitua os nomes de arquivo pelos seus caminhos reais. notes.txt, os logs e os totais mostrados são exemplos de entrada e saída, não valores esperados para qualquer arquivo. Execute consultas em arquivos que você tem permissão para ler.
Você pode usar wc para conferir logs, contar resultados de busca e testar condições em scripts. Para interpretar os números, distinga quebras de linha de linhas visíveis e bytes de caracteres: essas medidas nem sempre coincidem.
O que é o comando wc?
wc vem de word count, ou contagem de palavras, mas também calcula outras medidas da entrada. Se nenhum arquivo for especificado ou um - for usado no lugar de um nome de arquivo, ele lê da entrada padrão, tornando conveniente conectar com outros comandos via pipe.
No GNU wc, uma palavra é uma sequência não vazia de caracteres delimitada por espaços em branco. Ele não consulta um dicionário nem analisa a gramática; uma sequência com pontuação junto ao texto também pode contar como uma palavra.
Locale é a configuração regional que informa, entre outras coisas, como interpretar caracteres e espaços. NUL é o byte de valor zero, usado para separar nomes de arquivo sem confundi-los com espaços ou quebras de linha.
Sintaxe básica e leitura da saída
A sintaxe básica é a seguinte. Colchetes indicam itens opcionais e não devem ser incluídos no comando real.
wc [options] [file...]
Se você especificar um único arquivo sem quaisquer opções, o número de linhas, o número de palavras, o número de bytes e o nome do arquivo serão exibidos.
wc notes.txt
12 48 317 notes.txt
O resultado acima significa que notes.txt contém 12 caracteres de nova linha, 48 palavras e 317 bytes. O espaçamento dos campos de saída pode variar dependendo da entrada, portanto, você não deve interpretar o resultado com base no número de espaços.
Para ver apenas o valor de que você precisa, especifique a opção correspondente.
wc -l notes.txt
wc -w notes.txt
wc -c notes.txt
Principais opções do wc
| Opção | O que conta | Pontos a observar |
|---|---|---|
-l, --lines |
Número de caracteres de nova linha | Se a última linha não tiver nova linha, essa linha não é incluída |
-w, --words |
Número de palavras separadas por espaços | A classificação de espaços depende do locale |
-c, --bytes |
Número de bytes | Um caractere multibyte pode ter múltiplos bytes por caractere |
-m, --chars |
Número de caracteres | Depende do locale e da codificação de caracteres |
-L, --max-line-length |
Largura de tela da linha mais longa | Não é apenas uma contagem simples de caracteres; tabulações e caracteres largos também são considerados |
--files0-from=arquivo |
Uma lista de arquivos separados por caracteres NUL | Opção de extensão GNU, útil para lidar com nomes de arquivos com caracteres especiais |
Você também pode especificar várias opções ao mesmo tempo. A ordem de saída não é determinada pela ordem das opções, mas pelo número de linhas, palavras, caracteres, bytes e comprimento máximo da linha. Para a definição exata e opções de extensão GNU, você pode consultar a documentação oficial do GNU Coreutils wc.
Como contar o número de linhas com precisão
wc -l conta os caracteres de nova linha
wc -l retorna o número de caracteres de nova linha na entrada, não o número lógico de linhas. Para um arquivo de texto típico, cada linha termina com uma nova linha, então o resultado corresponde ao número de linhas, mas se a última linha não tiver uma nova linha, pode ser um a menos do que as linhas visíveis.
wc -l access.log
Você pode verificar se um arquivo de texto termina com uma nova linha inspecionando o último byte assim. Se o resultado for 0a, ele termina com uma nova linha LF.
tail -c 1 notes.txt | od -An -t x1
LF significa line feed, o byte de quebra de linha 0a. Em um arquivo vazio, não há último byte e esse comando não mostra um valor; em um arquivo sem quebra final, ele mostra outro byte.
Mostrar apenas o número, sem o nome do arquivo
Se você passar um arquivo como argumento, o nome do arquivo aparecerá após o resultado. Se você quiser armazenar apenas os números em uma variável de shell, use redirecionamento de entrada padrão.
line_count=$(wc -l < notes.txt)
printf '%s\n' "$line_count"
GNU wc exibe valores sem espaços à esquerda ao imprimir um único valor, mas se o script considerar outras implementações também, é mais seguro verificar separadamente o formato do número.
Diferença entre bytes e caracteres
-c conta bytes
wc -c contabiliza o número de bytes na entrada. É adequado para verificar o tamanho do arquivo em bytes ou calcular o tamanho real dos dados a serem transferidos.
wc -c document.txt
Se você precisar apenas do tamanho relatado pelo sistema de arquivos, stat pode ser mais apropriado porque ele pode obter o valor a partir dos metadados sem ler o arquivo completo.
stat -c '%s' document.txt
-m conta caracteres conforme o locale
wc -m conta os caracteres com base no locale e na codificação atuais. Em UTF-8, um caractere ASCII possui 1 byte, enquanto um caractere não ASCII pode usar vários bytes, então os resultados de -c e -m podem diferir para o mesmo arquivo.
printf 'Linux café\n' | wc -c
printf 'Linux café\n' | wc -m
Em um locale UTF-8, o exemplo produz 12 bytes e 11 caracteres, incluindo o espaço e a quebra de linha final. Um caractere percebido pelo leitor pode conter mais de um ponto de código: é e e seguido de um acento combinante podem parecer iguais e resultar em contagens diferentes com -m.
Se o arquivo tiver sequências inválidas na codificação esperada, -m pode produzir um resultado diferente do previsto. Verifique a configuração com locale e use uma codificação compatível com o arquivo.
Como a contagem de palavras é calculada?
wc -w conta o número de strings não vazias separadas por espaços. Espaços consecutivos ou tabulações atuam como delimitadores, e ele não remove pontuação nem analisa a morfologia da língua.
printf 'one two\tthree\n' | wc -w
3
wc -w pode não servir para segmentar palavras em todos os idiomas nem para contar tokens de um modelo de linguagem. Quando a separação por espaços não corresponde à unidade desejada, use um analisador ou tokenizador adequado.
Contagens e totais de vários arquivos
Resultados por arquivo e a linha total
Quando múltiplos arquivos são especificados, uma linha total mostrando a soma geral é adicionada após os resultados de cada arquivo.
wc -l january.log february.log march.log
120 january.log
135 february.log
98 march.log
353 total
Controlar o total com a opção GNU --total
O GNU wc oferece, desde o Coreutils 9.2, controle da linha de total com --total=auto, always, only ou never. Se somente o número total for necessário, ele pode ser usado da seguinte maneira.
wc -l --total=only january.log february.log march.log
Para os três arquivos da saída ilustrada, o resultado é apenas 353, sem nomes e sem a palavra total. A opção exige Coreutils 9.2 ou posterior; confira wc --help na sua instalação antes de utilizá-la.
--total é uma extensão do GNU e pode não estar disponível em versões mais antigas do Coreutils ou em outros ambientes semelhantes ao Unix. Se for necessária portabilidade, verifique o suporte usando wc --help e use um método para lidar com a última linha da saída existente.
Exemplos práticos usando pipes
Contar linhas encontradas em uma busca
Você pode contar o número de linhas correspondentes passando os resultados do grep para o wc -l.
grep 'ERROR' app.log | wc -l
A contagem representa linhas que contêm ERROR, não o número de ocorrências. Em scripts Bash, uma falha de grep pode ficar escondida pelo sucesso do último comando do pipeline; considere set -o pipefail e trate também o estado de saída.
Se você precisar apenas do número de linhas correspondentes em um único arquivo, grep -c 'ERROR' app.log é mais direto. Ambos os métodos contam uma linha apenas uma vez, mesmo que o padrão apareça várias vezes nessa linha. Para métodos detalhados de pesquisa, consulte o uso do comando grep no Linux.
Contar linhas de dados CSV
Se a primeira linha de um arquivo CSV contiver os nomes das colunas, você pode pular o cabeçalho usando tail -n +2 e então contar as linhas de dados.
tail -n +2 data.csv | wc -l
Esse atalho pressupõe um registro por linha e uma quebra de linha no fim de cada registro. Se o último registro não terminar com quebra de linha, a contagem pode ficar menor.
Para arquivos onde quebras de linha reais são permitidas dentro dos campos CSV, um único registro pode ocupar várias linhas físicas, portanto, você não pode contar com precisão o número de registros dessa maneira. Esses arquivos precisam ser processados com um analisador CSV. Você pode verificar o método para especificar o intervalo em tail em uso do comando tail no Linux.
Contar arquivos com nomes que contêm caracteres especiais
A saída normal do find pode contar incorretamente o número de itens se os nomes dos arquivos contiverem caracteres de quebra de linha. Em um ambiente GNU, você pode separar os nomes dos arquivos com um caractere NUL e então contar o número de NULs.
find ./logs -type f -name '*.log' -print0 | tr -cd '\0' | wc -c
Esse exemplo conta arquivos regulares *.log em logs e em seus subdiretórios. -print0 emite um separador NUL por nome; tr mantém esses separadores e wc -c os conta.
Isso é mais seguro para nomes de arquivos que contêm espaços e quebras de linha do que simplesmente usar find... | wc -l. O padrão de busca *.log deve ser colocado entre aspas para que o shell não o expanda primeiro.
Contar processos na lista do sistema
Se o GNU/Linux ps suportar --no-headers, você pode contar as linhas da lista de processos excluindo o cabeçalho.
ps -e --no-headers | wc -l
É uma captura no momento em que o comando é executado, e os resultados podem variar dependendo se os próprios processos do pipeline estão incluídos ou da implementação do ps. Ao usá-lo como uma métrica de monitoramento, considere usar ferramentas dedicadas ou um método de coleta baseado em /proc.
Medir a largura da linha mais longa
wc -L calcula a largura máxima exibida na tela, não a contagem simples de bytes ou de caracteres da linha mais longa. O GNU wc leva em conta caracteres largos com base no locale atual e considera paradas de tabulação a cada 8 colunas.
wc -L table.txt
Por exemplo, uma linha com a, uma tabulação e b tem largura máxima de 9 colunas. Ao usar -L em vários arquivos, o valor final é a maior largura entre eles, e não a soma das larguras.
Portanto, você não deve assumir que o resultado -L seja o mesmo que o comprimento de caracteres obtido com awk '{ print length }' ou a contagem de bytes de wc -c. Para tarefas que requerem uma contagem exata de caracteres, como verificações de estilo de código, você deve primeiro verificar a definição de comprimento usada pela ferramenta.
Como processar muitos arquivos com segurança
Evitar o limite de tamanho da linha de comando
Quando há muitos arquivos, a expansão de curingas pelo shell pode exceder o limite de comprimento da linha de comando. A opção --files0-from=- do GNU wc lê uma lista de arquivos separados por NUL da entrada padrão para evitar esse problema.
find ./logs -type f -name '*.log' -print0 | wc -l --files0-from=-
Este comando imprime o número de linhas em cada arquivo de log e o total geral. Os nomes são transmitidos sem ambiguidade mesmo com espaços ou quebras de linha, pois o separador é NUL. O total padrão aparece quando há mais de um arquivo.
Cuidado com totais parciais de xargs
find... | xargs wc -l pode ser dividido em múltiplas execuções de wc quando há muitos arquivos. Nesse caso, cada execução gera um total separado, tornando difícil ler o total geral diretamente. Em um ambiente GNU, --files0-from=- é mais adequado para agregar toda a lista de uma vez.
Princípios para uso em scripts de shell
Solicitar apenas o valor necessário
Não divida as múltiplas colunas da saída wc sem opções por espaços; em vez disso, solicite apenas o valor necessário com -l, -w ou -c. Se o nome do arquivo também não for necessário, use redirecionamento de entrada.
bytes=$(wc -c < archive.dat)
Distinguir erros de um resultado zero
O resultado 0 para um arquivo vazio e um erro ao tentar ler o arquivo têm significados diferentes. Se você armazenar apenas o valor, pode perder o erro padrão ou o status de saída, então, em automação importante, verifique também se o comando foi bem-sucedido.
if count=$(wc -l < input.txt); then
printf 'lines=%s\n' "$count"
else
printf 'Could not read input.txt.\n' >&2
fi
Esse trecho apenas escolhe entre mostrar o número e mostrar um diagnóstico; não encerra o script com falha por conta própria. Se o erro precisar interromper um script executável, inclua exit 1 no ramo else, depois da mensagem. Não use essa saída como sucesso silencioso de uma automação.
Dúvidas e cuidados frequentes
O resultado de wc -l é um a menos do que o esperado
É provável que a última linha não termine com um caractere de nova linha. wc -l conta os caracteres de nova linha, então ele não inclui a linha final incompleta. Antes de alterar arbitrariamente o formato original, verifique as regras de saída do programa que gerou o arquivo.
-c e -m diferem para caracteres multibyte
-c conta bytes, enquanto -m conta caracteres. Essa diferença é normal em codificações multibyte como UTF-8. Se o objetivo for o tamanho de armazenamento, use -c; para contar caracteres segundo a codificação, confira o locale e use -m. Essa medida não garante o número de símbolos percebidos pelo leitor.
Posso contar o número de arquivos com a saída do ls?
Para nomes de arquivos normais, ls | wc -l pode parecer simples, mas não é adequado para automação devido a aliases, formatos de saída e nomes de arquivos contendo quebras de linha. Use find para especificar tipos de arquivo e profundidade de pesquisa, e se estiver lidando com nomes de arquivos arbitrários, escolha o método separado por NUL.
Perguntas frequentes
O que acontece se você executar wc sem opções?
Por padrão, o número de linhas, palavras e bytes é exibido nessa ordem. Se você especificar um arquivo como argumento, o nome do arquivo também será mostrado ao final.
Qual é o resultado do wc para um arquivo vazio?
Um arquivo vazio, sem conteúdo, possui 0 linhas, 0 palavras e 0 bytes. Um arquivo com apenas um caractere de nova linha mostrará 1 no wc -l, e a contagem de bytes pode variar dependendo do formato de nova linha usado.
O wc -w conta palavras com precisão em todos os idiomas?
O wc -w conta sequências separadas por espaços em branco; ele não realiza segmentação de palavras levando em consideração o idioma. Trate o resultado como uma contagem delimitada por espaços em branco, e não como contagem linguística de palavras.
Posso contar o número de linhas em um diretório em si?
wc não é um comando para contar entradas de diretório diretamente. Você precisa criar a lista de arquivos que deseja usando comandos como find e então agregar os resultados. Se houver caracteres especiais nos nomes dos arquivos, use caracteres NUL como separadores em vez de quebras de linha.
Resumo
O número de linhas pode ser verificado com wc -l, o número de palavras com wc -w, o número de bytes com wc -c e o número de caracteres com wc -m. A saída sem opções mostra linhas, palavras e bytes em ordem, e se vários arquivos forem especificados, os valores de cada arquivo e a soma total são exibidos.
Para resultados precisos, lembre-se de que wc -l conta os caracteres de nova linha, bytes e caracteres podem diferir, e um delimitador NUL pode ser necessário para a lista de nomes de arquivos. Para ver outras ferramentas básicas juntas, você pode consultar uma lista de comandos comumente usados no Linux.




