Comando wc: contar líneas y palabras, y usar wc -l con tuberías
El comando wc es un comando de Linux que cuenta y muestra el número de líneas, palabras y bytes de un archivo. Si cuentas con wc -l las líneas de un archivo de ejemplo de registro de acceso de un servidor web, obtienes 10, y si filtras solo las respuestas 404 con grep y las pasas a wc -l, puedes ver el número de peticiones fallidas, 3, como un solo número.
Los registros, el contenido de los archivos y la carpeta de trabajo /root/work que aparecen abajo son valores de ejemplo. El registro es un archivo de diez líneas creado con direcciones IP reservadas para documentación, y los demás archivos también se crearon para pruebas.
1️⃣ Uso básico del comando wc y cómo leer su salida
La forma básica del comando es wc, las opciones y los archivos, en ese orden. Si das solo un archivo sin opciones, muestra el número de líneas, de palabras y de bytes en ese orden y añade el nombre del archivo al final.
cd /root/workwc access.log 10 100 766 access.logEn el resultado de contar el registro de acceso, 10 es el número de líneas, 100 el de palabras y 766 el de bytes.
Para ver un solo número, añade una de las opciones -l, -w o -c.
wc -l access.log10 access.logwc -w access.log100 access.logwc -c access.log766 access.logSi das un archivo que no existe, aparece un mensaje de error y el código de salida es 1.
wc nosuch.txtwc: nosuch.txt: No such file or directoryecho $?12️⃣ Contar líneas con wc -l y tuberías
Cuando el nombre del archivo sale junto al número de líneas, tienes que recortar el nombre una vez más al guardar el número en una variable de un script. Si pasas el archivo con una redirección (<) o una tubería, wc no conoce el nombre del archivo y muestra solo el número.
wc -l < access.log10cat access.log | wc -l10Si pones grep antes de la tubería, puedes contar solo las líneas que cumplen una condición. La búsqueda incluyó los espacios antes y después del código de respuesta 404, y tres líneas contenían 404.
grep ' 404 ' access.log | wc -l3Para contar cuántas IP se conectaron, recorta solo el primer campo, elimina las líneas repetidas con sort -u y luego cuenta. En el registro de diez líneas había cuatro IP distintas.
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 -l4wc -l cuenta el número de caracteres de salto de línea. Por eso, en un archivo sin salto de línea al final de la última línea, wc -l muestra 1 aunque cat muestre dos líneas.
cat no-newline.txtfirst line
last linewc -l no-newline.txt1 no-newline.txtSi el número de líneas sale con una de menos, comprueba primero si la última línea termina con un salto de línea.
3️⃣ Opciones de wc y recuento de caracteres con -c y -m
En UTF-8, las letras inglesas y los dígitos ocupan 1 byte por carácter, mientras que los caracteres coreanos (hangul) y ☕ ocupan 3 bytes cada uno. Por eso, en un archivo solo con texto en inglés, el número de bytes contado con -c y el de caracteres contado con -m coinciden, pero cuando hay coreano los dos números cambian. La comparación usa un archivo con dos líneas de nombres de menú en coreano y una línea en inglés.
cat menu.txt아메리카노
카페 라테 ☕
teawc -c menu.txt38 menu.txtwc -m menu.txt18 menu.txt-c dio 38 y -m dio 18, una diferencia de 20. Son los 2 bytes de más que ocupa cada uno de los nueve caracteres coreanos y ☕, así que en un archivo con coreano hay que contar con -m para que coincida con el número real de caracteres. La medición se hizo con la configuración regional C.UTF-8 y, según el manual, -m cuenta en las unidades de carácter de la configuración regional.
-L muestra el ancho en pantalla de la línea más larga. En el registro de acceso, la línea más larga tenía 82 columnas; en el archivo de menú, cada carácter coreano y ☕ ocupa dos columnas, así que una línea de 7 caracteres dio 12.
wc -L access.log82 access.logwc -L menu.txt12 menu.txtLas letras latinas con tilde ocupan 2 bytes por carácter en UTF-8. Se midió aparte con un archivo que solo contiene la línea café.
cat cafe.txtcaféwc -c cafe.txt6 cafe.txtwc -m cafe.txt5 cafe.txt-c dio 6 y -m dio 5, porque la única é ocupó un byte de más. Las letras inglesas y los dígitos ocupan 1 byte, las letras con tilde como la é ocupan 2 bytes, y los caracteres coreanos y ☕ ocupan 3 bytes, así que el número de bytes cambia aunque haya el mismo número de caracteres.
La tabla reúne el comando adecuado para cada tarea y el número contado en este artículo.
| Tarea | Comando | Medido en este artículo |
|---|---|---|
| Obtener solo el número de líneas | wc -l < access.log | 10Solo el número, sin el nombre del archivo |
| Contar las líneas que cumplen una condición | grep ‘ 404 ‘ access.log | wc -l | 3Líneas con respuesta 404 |
| Contar valores distintos | cut -d ‘ ‘ -f 1 access.log | sort -u | wc -l | 4Número de IP distintas |
| Comprobar el tamaño del archivo | wc -c access.log | 766Número de bytes |
| Número de caracteres de un archivo con coreano | wc -m menu.txt | 1838 si se cuenta el mismo archivo con -c |
| Ancho en pantalla de la línea más larga | wc -L access.log | 8212 en el archivo de menú, que cuenta cada carácter coreano como dos columnas |
| Total de líneas de varios archivos | wc -l *.log | 13Total en la línea total |
4️⃣ Totales de varios archivos con wc en Linux
Si das varios archivos, wc muestra una línea por archivo y añade el total en la última línea como total. Si cuentas juntos el registro de acceso y el registro de errores, el 13 de la línea total es la suma de las líneas de los dos archivos.
wc access.log error.log 10 100 766 access.log
3 11 76 error.log
13 111 842 totalPara contar de una vez los registros con la misma extensión, usa un comodín. La shell convierte *.log en nombres de archivo antes de pasarlos, así que el resultado es el mismo que escribir cada nombre de archivo.
wc -l *.log 10 access.log
3 error.log
13 totalLos archivos con extensiones distintas también se cuentan de una vez si escribes sus nombres seguidos. Al contar juntos los dos registros y el archivo de menú, el resultado fue total 16.
wc -l access.log error.log menu.txt 10 access.log
3 error.log
3 menu.txt
16 total🔲 Simulador del comando wc
En el simulador de abajo puedes escribir wc tú mismo sobre los archivos de ejemplo del artículo. Con los chips puedes probar -l, -m y el recuento con tuberías, y si añades una línea a access.log y vuelves a contar, sale el número aumentado.
🔢 FAQ & contenido recomendado
Linux · Texto
Comando sort de Linux: ordenar archivos
Opciones y ejemplos de sort para ordenar el contenido de un archivo alfabéticamente o en orden ascendente o descendente.
Linux · Texto
Comando uniq de Linux
Cómo usar uniq para dejar solo una de las líneas repetidas y contar con -c cuántas veces se repiten.
Linux · Texto
Comando head y comando tail de Linux
Opciones y uso de head, que muestra las 10 primeras líneas de un archivo, y de tail, que muestra las 10 últimas.
ℹ️ Aviso de afiliados
El contenido de este sitio incluye enlaces de afiliado. Cuando un visitante compra un producto o servicio a través de uno de ellos, el sitio recibe una comisión del vendedor. El importe que paga el comprador(baja durante las promociones ↓)no aumenta. Los precios, descuentos y existencias publicados corresponden al momento de redacción y pueden variar, así que confírmalos con el vendedor antes de comprar. Los productos se eligen y evalúan con criterios propios, y las comisiones no influyen en el orden ni en el contenido de las reseñas.