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
wcconta 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(-cconta 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 arquivoimprime 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.
wc serve. O nome vem de word count, ou contagem de palavras.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.
2. Contar Apenas Linhas com -l
Conclusão:
wc -lmostra 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:
-wconta palavras,-cconta bytes,-mconta caracteres. Para texto multibyte (como japonês ou português com acentos),-ce-mdiferem.
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).
wc -c mostrou 10. Isso é um bug?-c conta são bytes.-m. Com isso em mente, a confusão acaba.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
-mpara caracteres. Use-cquando 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 -lconta linhas da saída = contagem de itens.ls | wc -legrep ... | wc -lsão as formas mais comuns.
wc brilha. Ele também conta o que recebe através de um pipe (|).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.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,grepoufind
6. Contando Múltiplos Arquivos e Totais
Conclusão: Passe múltiplos arquivos e o
wcimprime uma linha para cada, depois uma linhatotalcom 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
wc -l arquivo... owcabre o arquivo por conta própria, então ele indica de qual arquivo veio o númerowc -l < arquivo... o shellUm programa interativo que interpreta os comandos digitados e os executa. transmite só o conteúdo. Owcnunca fica sabendo o nome, então sai apenas o número
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.
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
-c dá bytes e o -m dá caracteres. Em japonês os dois são diferentes.wc -l. Essa também ficou.Resumo de Hoje em 3 Linhas
- O
wcimprime linhas, palavras e bytes, nessa ordem, da esquerda para a direita - Conte caracteres japoneses com
-m. O-cconta bytes, então o número sai maior - Para contar itens, use o formato
comando | wc -l