Comando wc: Contando Linhas, Palavras e Bytes

Comando wc: Contando Linhas, Palavras e Bytes

O Que Voce Vai Aprender

  • Como contar linhas, palavras e bytes de uma vez com wc
  • Quando usar -l / -w / -c / -m
  • Como escrever o padrao classico de contagem com pipe como ls | wc -l
  • Por que iniciantes ficam presos em "bytes e caracteres diferem" e "a ultima linha nao e contada"

Resumo Rapido

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

Ambiente

  • SO: Ubuntu / Linux tipico
  • GNU coreutils wc (wc = word count)
  • Codificacao de caracteres UTF-8 assumida

1. O Que E o wc? Conte Tudo Primeiro

Conclusao: wc arquivo imprime tres numeros em ordem: linhas, palavras e bytes. Apesar do nome "word count" (contagem de palavras), ele conta linhas e bytes tambem.

Lina: Senpai, quando eu quero saber "quantas linhas tem este arquivo?" ou "quantas palavras?", tenho que contar manualmente?
Veterano Linny: E exatamente para isso que o wc serve. Significa word count (contagem de palavras), mas na verdade ele reporta linhas, palavras e bytes de uma vez.
Lina: Entao o nome e 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 tres numeros significam (da esquerda para a direita)

Posicao Numero Significado
1o 3 Linhas
2o 6 Palavras
3o 38 Bytes

O nome do arquivo aparece no final.

Lina: Tres numeros de uma vez... vou me perder sobre qual e qual.
Veterano Linny: Basta lembrar a ordem: linhas, palavras, bytes. Na pratica, voce geralmente quer apenas um deles, como "so a contagem de linhas." Vamos ver as opcoes a seguir.

2. Contar Apenas Linhas com -l

Conclusao: wc -l mostra apenas a contagem de linhas. E o padrao para contar linhas de log ou entradas de lista.

$ wc -l sample.txt
3 sample.txt

-l significa line (linha).

A forma padrao 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

Conclusao: -w conta palavras, -c conta bytes, -m conta caracteres. Para texto multibyte (como japones ou portugues com acentos), -c e -m diferem.

3-1. Palavras com -w

$ wc -w sample.txt
6 sample.txt

-w e word (palavra). Conta blocos separados por espacos ou quebras de linha como uma palavra cada.

3-2. Bytes com -c

$ wc -c sample.txt
38 sample.txt

-c parece significar character (caractere), mas o que ele realmente conta sao bytes. Essa e a primeira armadilha.

3-3. Caracteres com -m

$ wc -m sample.txt
38 sample.txt

Para arquivos somente ASCII, bytes e caracteres coincidem (1 caractere = 1 byte). A diferenca aparece com texto multibyte.

Opcao Mnemonico Conta
-l line Linhas
-w word Palavras
-c -- Bytes
-m -- Caracteres

4. Armadilha Comum: Bytes vs Caracteres em Texto Multibyte

Conclusao: Em UTF-8, um caractere japones ocupa 3 bytes. Para contar caracteres, use -m (caracteres), nao -c (bytes).

Lina: Eu contei um arquivo contendo "aiu" (3 caracteres japoneses) e wc -c mostrou 10. Isso e um bug?
Veterano Linny: Nao e um bug. -c conta bytes. Em UTF-8, um caractere japones = 3 bytes. Entao "aiu" = 3 caracteres x 3 bytes = 9 bytes, mais 1 byte para a quebra de linha final = 10 no total.

Vamos ver na pratica.

$ 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

  • Querer uma "contagem de caracteres" de texto multibyte mas usar -c, que imprime um numero aproximadamente 3x maior
  • Use -m para caracteres, e -c quando precisar do tamanho dos dados em bytes
  • Ambos contam a quebra de linha final como uma unidade

5. O Padrao Classico de Contagem Com Pipe

Conclusao: algum-comando | wc -l conta linhas da saida = contagem de itens. ls | wc -l e grep ... | wc -l sao as formas mais comuns.

Lina: Agora sei contar as linhas de um arquivo. Mas tambem quero coisas como "quantos arquivos tem nesta pasta?"
Veterano Linny: E ai que o wc brilha. Ele tambem pode contar o que recebe atraves de um pipe (|). ls | wc -l diz "o numero de linhas que o ls produziu" = o numero de arquivos.

5-1. Contar arquivos e diretorios

$ ls | wc -l
12

Cada linha da saida do ls e um item, entao contar linhas da a contagem.

5-2. Contar linhas correspondentes de uma busca

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

grep tem sua propria opcao de contagem -c. grep -c "error" app.log faz a mesma coisa e e mais curto. Mantenha wc -l como a forma de uso geral que funciona com qualquer comando.

Por que pipe + wc -l e pratico

  • Sem nome de arquivo na saida (apenas um numero), entao se encaixa em processamento posterior
  • Funciona com qualquer coisa -- ls, grep, find e mais

6. Contando Multiplos Arquivos e Totais

Conclusao: Passe multiplos arquivos e o wc imprime uma linha para cada, depois uma linha total com a soma.

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

O total final e a soma de todos os arquivos -- pratico para medir a contagem total de linhas de um projeto.

7. Erros Comuns de Iniciantes

Conclusao: Discrepancias de caracteres vem da confusao entre -c/-m; passe a entrada via redirecionamento para omitir o nome do arquivo; a contagem da ultima linha depende da quebra de linha final.

7-1. O nome do arquivo atrapalha

wc -l arquivo imprime o nome do arquivo tambem. Quando voce quer apenas o numero, passe o conteudo como entrada padrao com redirecionamento <.

# 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

  • wc -l arquivo ... wc abriu o arquivo, entao ele indica qual arquivo
  • wc -l < arquivo ... o shell transmite o conteudo, entao wc nunca sabe o nome do arquivo -> apenas o numero

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

wc -l conta caracteres de quebra de linha. Se a ultima linha nao tem quebra de linha, essa linha nao e contada.

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

Parece ter 3 linhas (a b c), mas ha apenas 2 quebras de linha, entao o resultado e 2. Lembre-se que arquivos de texto bem formados convencionalmente terminam com uma quebra de linha.

7-3. A contagem de caracteres para japones e muito grande

Como coberto na secao 4, -c conta bytes. Para caracteres, use -m.

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

8. Mini Exercicios: Tente Voce Mesmo

Conclusao: Tres tarefas -- contar linhas, contar itens e contar caracteres -- permitem que voce confirme os basicos do wc e o uso de pipes na pratica.

Lina: Agora tenho o conhecimento! Quero confirmar na pratica.
Veterano Linny: Otimo, preparei tres tarefas. Tente-as no seu terminal.

Tarefa 1: Conte quantas linhas o seguinte arquivo tem.

$ cat << 'EOF' > fruits.txt
apple
banana
orange
grape
EOF
Mostrar dica

A opcao para contar linhas e -l (line).

Resposta exemplo
$ wc -l fruits.txt
4 fruits.txt

Tarefa 2: Conte quantos arquivos .txt existem no diretorio atual.

Mostrar dica

Redirecione a saida de ls *.txt para wc -l.

Resposta exemplo
$ ls *.txt | wc -l

(o numero varia conforme o ambiente)

Tarefa 3: Conte os caracteres em fruits.txt (nao bytes).

Mostrar dica

Para contagem de caracteres use -m. -c conta bytes.

Resposta exemplo
$ wc -m fruits.txt

(texto ASCII, entao -m e -c coincidem aqui; compare-os para ver a diferenca)

9. Modelos Para Copiar e Colar

Conclusao: Mantenha as formas comuns -- linhas, itens, caracteres, totais -- ao alcance.

Formas praticas para ter a mao

# 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

Resumo: O Que Ler a Seguir