Comando wc: contar linhas e palavras e usar wc -l com pipes
O comando wc é um comando do Linux que conta e mostra o número de linhas, palavras e bytes de um arquivo. Se você contar com wc -l as linhas de um arquivo de exemplo com o log de acesso de um servidor web, o resultado é 10, e se filtrar só as respostas 404 com grep e passá-las para wc -l, você vê o número de requisições que falharam, 3, como um único número.
Os logs, o conteúdo dos arquivos e a pasta de trabalho /root/work abaixo são valores de exemplo. O log é um arquivo de dez linhas criado com endereços IP reservados para documentação, e os outros arquivos também foram todos criados para teste.
1️⃣ Uso básico do comando wc e como ler a saída
A forma básica do comando é wc, depois as opções e depois os arquivos. Se você passar só um arquivo, sem opções, ele mostra o número de linhas, de palavras e de bytes nessa ordem e coloca o nome do arquivo no final.
cd /root/workwc access.log 10 100 766 access.logNo resultado da contagem do log de acesso, 10 é o número de linhas, 100 o de palavras e 766 o de bytes.
Para ver só um número, acrescente uma das opções -l, -w ou -c.
wc -l access.log10 access.logwc -w access.log100 access.logwc -c access.log766 access.logSe você passar um arquivo que não existe, aparece uma mensagem de erro e o código de saída é 1.
wc nosuch.txtwc: nosuch.txt: No such file or directoryecho $?12️⃣ Contar linhas com wc -l e pipes
Quando o nome do arquivo sai junto com o número de linhas, é preciso cortar o nome mais uma vez ao guardar o número em uma variável de script. Se você passar o arquivo por redirecionamento (<) ou por pipe, o wc não conhece o nome do arquivo e mostra só o número.
wc -l < access.log10cat access.log | wc -l10Colocando grep antes do pipe, você conta só as linhas que atendem a uma condição. A busca incluiu os espaços antes e depois do código de resposta 404, e três linhas continham 404.
grep ' 404 ' access.log | wc -l3Para contar quantos IPs se conectaram, recorte só o primeiro campo, remova as linhas repetidas com sort -u e depois conte. No log de dez linhas, havia quatro IPs diferentes.
cut -d ' ' -f 1 access.log | sort -u192.0.2.10
192.0.2.44
198.51.100.7
203.0.113.25cut -d ' ' -f 1 access.log | sort -u | wc -l4O wc -l conta o número de caracteres de quebra de linha. Por isso, em um arquivo sem quebra de linha no fim da última linha, o wc -l mostra 1 mesmo que o cat mostre duas linhas.
cat no-newline.txtfirst line
last linewc -l no-newline.txt1 no-newline.txtSe o número de linhas vier uma a menos, verifique primeiro se a última linha termina com uma quebra de linha.
3️⃣ Opções do wc e contagem de caracteres com -c e -m
Em UTF-8, letras do inglês e dígitos ocupam 1 byte por caractere, enquanto caracteres coreanos (hangul) e ☕ ocupam 3 bytes cada. Por isso, em um arquivo só com texto em inglês, o número de bytes contado com -c e o de caracteres contado com -m são iguais, mas quando entra coreano os dois números ficam diferentes. A comparação usa um arquivo com duas linhas de nomes de cardápio em coreano e uma linha em inglês.
cat menu.txt아메리카노
카페 라테 ☕
teawc -c menu.txt38 menu.txtwc -m menu.txt18 menu.txt-c deu 38 e -m deu 18, uma diferença de 20. São os 2 bytes a mais que cada um dos nove caracteres coreanos e o ☕ ocupa, então em um arquivo com coreano é preciso contar com -m para bater com o número real de caracteres. A medição foi feita na localidade C.UTF-8 e, segundo o manual, -m conta nas unidades de caractere da localidade.
-L mostra a largura de exibição da linha mais longa. No log de acesso, a linha mais longa tinha 82 colunas; no arquivo de cardápio, cada caractere coreano e o ☕ ocupam duas colunas, por isso uma linha de 7 caracteres deu 12.
wc -L access.log82 access.logwc -L menu.txt12 menu.txtLetras latinas com acento ocupam 2 bytes por caractere em UTF-8. Isso foi medido à parte com um arquivo que contém só a linha café.
cat cafe.txtcaféwc -c cafe.txt6 cafe.txtwc -m cafe.txt5 cafe.txt-c deu 6 e -m deu 5, porque o único é ocupou um byte a mais. Letras do inglês e dígitos ocupam 1 byte, letras acentuadas como é ocupam 2 bytes e caracteres coreanos e ☕ ocupam 3 bytes, então o número de bytes muda mesmo com o mesmo número de caracteres.
A tabela reúne o comando certo para cada tarefa e o número contado neste artigo.
| Tarefa | Comando | Medido neste artigo |
|---|---|---|
| Obter só o número de linhas | wc -l < access.log | 10Só o número, sem o nome do arquivo |
| Contar as linhas que atendem a uma condição | grep ‘ 404 ‘ access.log | wc -l | 3Linhas com resposta 404 |
| Contar valores diferentes | cut -d ‘ ‘ -f 1 access.log | sort -u | wc -l | 4Número de IPs diferentes |
| Verificar o tamanho do arquivo | wc -c access.log | 766Número de bytes |
| Número de caracteres de um arquivo com coreano | wc -m menu.txt | 1838 ao contar o mesmo arquivo com -c |
| Largura de exibição da linha mais longa | wc -L access.log | 8212 no arquivo de cardápio, que conta cada caractere coreano como duas colunas |
| Total de linhas de vários arquivos | wc -l *.log | 13Total na linha total |
4️⃣ Total de vários arquivos com o wc do Linux
Se você passar vários arquivos, o wc mostra uma linha por arquivo e acrescenta o total na última linha como total. Ao contar juntos o log de acesso e o log de erros, o 13 da linha total é a soma das linhas dos dois arquivos.
wc access.log error.log 10 100 766 access.log
3 11 76 error.log
13 111 842 totalPara contar de uma vez os logs com a mesma extensão, use um curinga. O shell troca *.log pelos nomes dos arquivos antes de passá-los, então o resultado é o mesmo que escrever cada nome de arquivo.
wc -l *.log 10 access.log
3 error.log
13 totalArquivos com extensões diferentes também são contados de uma vez se você escrever os nomes em sequência. Os dois logs e o arquivo de cardápio contados juntos deram total 16.
wc -l access.log error.log menu.txt 10 access.log
3 error.log
3 menu.txt
16 total🔲 Simulador do comando wc
No simulador abaixo, você pode digitar o wc nos arquivos de exemplo do artigo. Com os chips você testa -l, -m e a contagem por pipe, e se acrescentar uma linha ao access.log e contar de novo, aparece o número maior.
🔢 FAQ & conteúdo recomendado
Linux · Texto
Comando sort do Linux: ordenar arquivos
Opções e exemplos do sort para ordenar o conteúdo de um arquivo em ordem alfabética, crescente ou decrescente.
Linux · Texto
Comando uniq do Linux
Como usar o uniq para manter só uma das linhas repetidas e contar com -c quantas vezes elas se repetem.
Linux · Texto
Comandos head e tail do Linux
Opções e uso do head, que mostra as 10 primeiras linhas de um arquivo, e do tail, que mostra as 10 últimas.
ℹ️ Aviso de afiliados
O conteúdo deste site contém links de afiliados. Quando um visitante compra um produto ou serviço por meio de um desses links, o site recebe uma comissão do vendedor. O valor que o comprador paga (em promoções, ele diminui ↓) não aumenta por causa disso. Preços, descontos e informações de estoque valem para o momento em que o texto foi escrito e podem ter mudado, por isso confirme com o vendedor antes de comprar. Os produtos são escolhidos e avaliados por critérios próprios, e o recebimento de comissão não influencia a ordem de apresentação nem o conteúdo das avaliações.