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(-cconta 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 arquivoimprime tres numeros em ordem: linhas, palavras e bytes. Apesar do nome "word count" (contagem de palavras), ele conta linhas e bytes tambem.
wc serve. Significa word count (contagem de palavras), mas na verdade ele reporta linhas, palavras e bytes de uma vez.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.
2. Contar Apenas Linhas com -l
Conclusao:
wc -lmostra 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:
-wconta palavras,-cconta bytes,-mconta caracteres. Para texto multibyte (como japones ou portugues com acentos),-ce-mdiferem.
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).
wc -c mostrou 10. Isso 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
-mpara caracteres, e-cquando 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 -lconta linhas da saida = contagem de itens.ls | wc -legrep ... | wc -lsao as formas mais comuns.
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,finde mais
6. Contando Multiplos Arquivos e Totais
Conclusao: Passe multiplos arquivos e o
wcimprime uma linha para cada, depois uma linhatotalcom 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...wcabriu o arquivo, entao ele indica qual arquivowc -l < arquivo... o shell transmite o conteudo, entaowcnunca 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.
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