Comando wc: Contando Linhas, Palavras e Bytes

Comando wc: Contando Linhas, Palavras e Bytes

O que você vai conseguir fazer

  • Contar linhas, palavras, bytes e caracteres separadamente com `wc`
  • Distinguir `-c` (bytes) de `-m` (caracteres) sem trocar um pelo outro
  • Contar itens através de um pipe, como em `ls | wc -l`

Pré-requisitos (leia estes primeiro)

O Que Você Vai Aprender

  • Como contar linhas, palavras e bytes de uma vez com wc
  • Quando usar -l / -w / -c / -m
  • Como escrever o padrão clássico de contagem com pipe como ls | wc -l
  • Por que iniciantes ficam presos em "bytes e caracteres diferem" e "a última linha não é contada"

As palavras usadas aqui (para não confundir depois)

  • Linha: uma linha dentro do arquivo. O wc conta linhas contando as quebras de linha.
  • Palavra: um bloco separado por espaços ou quebras de linha. Não é a mesma divisão que uma pessoa faria.
  • Byte: a unidade de tamanho dos dados. É nela que se mede o tamanho de um arquivo.
  • Caractere: um caractere como uma pessoa lê. Em japonês, um caractere não ocupa um byte. Essa diferença é a armadilha principal.
  • Codificação de caracteres: a regra que transforma caracteres em dados. Este artigo usa UTF-8.

Resumo Rápido

  • Contar tudo -> wc arquivo
  • Apenas linhas -> wc -l
  • Contar itens -> algum-comando | wc -l
  • Contar caracteres reais (multibyte) -> wc -m (-c conta bytes, não caracteres)

Ambiente

  • SO: Ubuntu / Linux típico
  • GNU coreutils wc (wc = word count)
  • Codificação de caracteres UTF-8 assumida

1. O Que É o wc? Conte Tudo Primeiro

Conclusão: wc arquivo imprime três números em ordem: linhas, palavras e bytes. Apesar do nome "word count" (contagem de palavras), ele conta linhas e bytes também.

Lina: Senpai, quando eu quero saber "quantas linhas tem este arquivo?" ou "quantas palavras?", tenho que contar manualmente?
Veterano Linny: É exatamente para isso que o wc serve. O nome vem de word count, ou contagem de palavras.
Veterano Linny: O nome fala em palavras, mas ele reporta linhas, palavras e bytes de uma vez.
Lina: Então o nome é um pouco mais restrito do que o que ele faz.

Vamos preparar um arquivo de exemplo.

$ cat sample.txt
hello world
linux command
penguin gym

Execute wc diretamente nele.

$ wc sample.txt
 3  6 38 sample.txt

O que os três números significam (da esquerda para a direita)

Posição Número Significado
1o 3 Linhas
2o 6 Palavras
3o 38 Bytes

O nome do arquivo aparece na ponta direita.

Lina: Três números de uma vez. Vou me perder sobre qual é qual.
Veterano Linny: Basta lembrar a ordem: linhas, palavras, bytes.
Veterano Linny: Na prática, você quase sempre quer apenas um deles, como a contagem de linhas. Vamos ver as opções a seguir.

2. Contar Apenas Linhas com -l

Conclusão: wc -l mostra apenas a contagem de linhas. É o padrão para contar linhas de log ou entradas de lista.

$ wc -l sample.txt
3 sample.txt

-l significa line (linha).

A forma padrão de perguntar "quantas linhas tem este log?"

# Quantas linhas se acumularam no log
$ wc -l /var/log/syslog

3. Palavras, Bytes e Caracteres: -w / -c / -m

Conclusão: -w conta palavras, -c conta bytes, -m conta caracteres. Para texto multibyte (como japonês ou português com acentos), -c e -m diferem.

3-1. Palavras com -w

$ wc -w sample.txt
6 sample.txt

-w é word (palavra). Conta blocos separados por espaços ou quebras de linha como uma palavra cada.

O texto em japonês não usa espaços entre as palavras. Por isso, em japonês o resultado do -w não bate com o que uma pessoa chamaria de palavra.

3-2. Bytes com -c

$ wc -c sample.txt
38 sample.txt

-c parece significar character, ou caractere. O que ele realmente conta são bytes. Essa é a primeira armadilha.

3-3. Caracteres com -m

$ wc -m sample.txt
38 sample.txt

Para arquivos somente ASCII, bytes e caracteres coincidem, porque cada caractere ocupa exatamente um byte.

A diferença aparece com texto multibyte. A próxima seção trata disso.

Opção Mnemônico Conta
-l line Linhas
-w word Palavras
-c -- Bytes
-m -- Caracteres

4. Lina Tropeça: Bytes vs Caracteres em Texto Multibyte

Conclusão: Em UTF-8, um caractere japonês ocupa 3 bytes. Para contar caracteres, use -m (caracteres), não -c (bytes).

Lina: Eu contei um arquivo contendo "aiu" (3 caracteres japoneses) e wc -c mostrou 10. Isso é um bug?
Veterano Linny: Não é um bug. O que o -c conta são bytes.
Veterano Linny: Em UTF-8, um caractere japonês ocupa 3 bytes. Então "aiu" são 3 caracteres x 3 bytes = 9 bytes.
Veterano Linny: Some 1 byte da quebra de linha final e você chega a 10.
Lina: Ah, então a quantidade de caracteres e o tamanho dos dados são duas coisas diferentes. Isso me pegou de surpresa.
Veterano Linny: Exato. Quando você quer a contagem que uma pessoa daria, use -m. Com isso em mente, a confusão acaba.
Lina: Agora entendi por que meu número era quase três vezes maior. Ficou claro.

Vamos ver na prática.

$ echo "あいう" > jp.txt
$ wc jp.txt
 1  1 10 jp.txt
# Bytes
$ wc -c jp.txt
10 jp.txt
# Caracteres (a quebra de linha conta como um caractere tambem)
$ wc -m jp.txt
4 jp.txt

Armadilha para iniciantes

  • Pedir a contagem de caracteres de texto multibyte com -c, que imprime um número cerca de 3x maior
  • Use -m para caracteres. Use -c quando quiser o tamanho dos dados
  • Os dois contam a quebra de linha final como uma unidade

5. O Padrão Clássico de Contagem Com Pipe

Conclusão: algum-comando | wc -l conta linhas da saída = contagem de itens. ls | wc -l e grep ... | wc -l são as formas mais comuns.

Lina: Agora sei contar as linhas de um arquivo. Mas também quero coisas como "quantos arquivos tem nesta pastaUm local que organiza arquivos. É a mesma ideia da "pasta" do Windows ou macOS.?"
Veterano Linny: É aí que o wc brilha. Ele também conta o que recebe através de um pipe (|).
Veterano Linny: Na tela, o ls distribui os nomes em colunas. Mas quando entrega a saída ao próximo comando por um pipe, ele manda um item por linha.
Veterano Linny: Então a contagem de linhas de ls | wc -l é o número de arquivos.

5-1. Contar arquivos e diretórios

$ ls | wc -l
12

Quando a saída vai para um pipe, o ls imprime um item por linha. Então contar as linhas dá a quantidade de itens.

Repare que o ls não conta arquivos ocultos, aqueles cujo nome começa com .. Para incluí-los, escreva ls -A | wc -l.

5-2. Contar linhas correspondentes de uma busca

# Quantas linhas no log contem "error"
$ grep "error" app.log | wc -l
27

O grep tem a sua própria opção de contagem -c. grep -c "error" app.log dá o mesmo resultado e é mais curto.

Já o wc -l funciona na saída de qualquer comando. Vale a pena guardar essa forma.

Por que pipe + wc -l é prático

  • Não há nome de arquivo na saída. Só um número, que já entra direto no próximo processamento
  • Funciona na saída de qualquer comando, como ls, grep ou find

6. Contando Múltiplos Arquivos e Totais

Conclusão: Passe múltiplos arquivos e o wc imprime uma linha para cada, depois uma linha total com a soma.

$ wc -l *.txt
  1 jp.txt
  3 sample.txt
  4 total

O total final é a soma de todos os arquivos. É prático para medir a contagem de linhas de um projeto inteiro.

7. Erros Comuns de Iniciantes

Conclusão: Discrepâncias de caracteres vêm da confusão entre -c/-m; passe a entrada via redirecionamento para omitir o nome do arquivo; a contagem da última linha depende da quebra de linha final.

7-1. O nome do arquivo atrapalha

wc -l arquivo imprime o nome do arquivo também. Quando você quer apenas o número, use o redirecionamento <. Ele envia o conteúdo do arquivo como entrada padrão.

# Nome do arquivo incluido
$ wc -l sample.txt
3 sample.txt
# Apenas o numero (sem nome do arquivo)
$ wc -l < sample.txt
3

Como funciona

7-2. Sem quebra de linha final faz a contagem parecer menor

wc -l conta caracteres de quebra de linha. Se a última linha não tem quebra de linha, essa linha não é contada.

# Um arquivo que nao termina com quebra de linha
$ printf "a\nb\nc" | wc -l
2

Na tela parecem 3 linhas: a, b e c. Mas há apenas 2 quebras de linha, então o resultado é 2.

Arquivos de texto bem formados terminam com uma quebra de linha. Com isso em mente, o resultado deixa de confundir.

7-3. A contagem de caracteres para japonês é muito grande

Como visto na seção 4, o -c conta bytes. Quando você quer caracteres, use -m.

$ wc -m jp.txt   # caracteres
$ wc -c jp.txt   # bytes (~3x para japones)

8. Mini Exercícios: Tente Você Mesmo

Conclusão: Três tarefas -- contar linhas, contar itens e contar caracteres -- permitem que você confirme os básicos do wc e o uso de pipes na prática.

Lina: Agora tenho o conhecimento. Quero confirmar na prática.
Veterano Linny: Ótimo, preparei três tarefas. Tente-as no seu terminal.

Tarefa 1: Conte quantas linhas o seguinte arquivo tem.

$ cat << 'EOF' > fruits.txt
apple
banana
orange
grape
EOF
Ver dica 1 (direcionamento)

Você quer o número de linhas. A seção 2 trouxe uma opção que conta só as linhas.

Ver dica 2 (nome do comando)

O comando é o wc. A opção é -l.

Ver a resposta
$ wc -l fruits.txt
4 fruits.txt

Tarefa 2: Conte quantos arquivos .txt existem no diretório atual.

Ver dica 1 (direcionamento)

Primeiro liste os arquivos .txt. Depois conte quantas linhas essa listagem tem. Esse número é a resposta.

Ver dica 2 (nome do comando)

Ligue a saída de ls *.txt ao wc -l por um pipe.

Ver a resposta
$ ls *.txt | wc -l

O número varia conforme o ambiente.

Tarefa 3: Conte os caracteres em fruits.txt (não bytes).

Ver dica 1 (direcionamento)

Você quer o número de caracteres que uma pessoa lê, e não o tamanho dos dados. Lembre da separação da seção 4.

Ver dica 2 (nome do comando)

O comando é o wc. A opção é -m. Escolher -c daria bytes.

Ver a resposta
$ wc -m fruits.txt

Este arquivo é texto ASCII, então -m e -c devolvem o mesmo número aqui.

Rode também wc -c fruits.txt e compare. Depois repita o par em um arquivo com texto japonês para ver a diferença aparecer.

9. Modelos Para Copiar e Colar

Conclusão: Mantenha as formas comuns -- linhas, itens, caracteres, totais -- ao alcance.

Formas práticas para ter à mão

# Contar tudo (linhas, palavras, bytes)
wc file.txt

# Apenas linhas
wc -l file.txt

# Apenas o numero (sem nome do arquivo)
wc -l < file.txt

# Contar itens (contar uma listagem)
ls | wc -l

# Contar correspondencias de busca
grep "keyword" file.txt | wc -l

# Contagem de caracteres (multibyte)
wc -m file.txt

# Contagem de bytes (estimativa de tamanho)
wc -c file.txt

# Total de linhas em multiplos arquivos
wc -l *.txt

10. Revisão

Lina: Vou resumir. O -c dá bytes e o -m dá caracteres. Em japonês os dois são diferentes.
Veterano Linny: Exato. Em UTF-8 um caractere japonês ocupa 3 bytes.
Lina: E para contar itens eu ligo a saída de um comando ao wc -l. Essa também ficou.
Veterano Linny: Perfeito. Guarde também que a contagem de linhas e, na verdade, a contagem de quebras de linha.

Resumo de Hoje em 3 Linhas

  1. O wc imprime linhas, palavras e bytes, nessa ordem, da esquerda para a direita
  2. Conte caracteres japoneses com -m. O -c conta bytes, então o número sai maior
  3. Para contar itens, use o formato comando | wc -l

Resumo: O Que Ler a Seguir