Linux / Comando / wc: contar líneas, palabras, bytes y caracteres
wc es un comando que calcula el número de líneas, palabras, bytes y caracteres de un archivo o de la entrada estándar. Si se ejecuta sin opciones, mostrará en orden el número de saltos de línea, palabras y bytes, y se pueden seleccionar solo los valores necesarios con -l, -w, -c y -m.
Se utiliza frecuentemente no solo para estadísticas simples, sino también para verificar el número de registros en un log, recopilar resultados de búsqueda, validar archivos de datos y para la evaluación de condiciones en scripts de shell. Sin embargo, es importante tener en cuenta que wc -l cuenta los caracteres de salto de línea y no las líneas visibles en la pantalla, y que hay que entender la diferencia entre -c y -m antes de usarlo.
¿Qué es el comando wc?
wc significa word count. Obtiene los recuentos de la entrada; según las opciones y el tipo de archivo, una implementación puede evitar leer todos los bytes, por ejemplo para obtener un tamaño. Si omite el archivo o utiliza -, lee la entrada estándar.
En GNU wc, una palabra es una secuencia de caracteres no vacía separada por espacios. No determina palabras gramaticales ni palabras registradas en un diccionario, por lo que una cadena con signos de puntuación también puede contarse como una sola palabra.
Sintaxis básica y cómo leer la salida
La sintaxis básica es la siguiente. Los corchetes indican opciones, por lo que no se deben ingresar en el comando real.
wc [OPCIONES] [ARCHIVO...]
Si se especifica un solo archivo sin opciones, se mostrarán el número de líneas, palabras, bytes y el nombre del archivo.
wc notes.txt
12 48 317 notes.txt
El resultado anterior significa que notes.txt tiene 12 caracteres de nueva línea, 48 palabras y 317 bytes. El espacio entre los campos de salida puede variar según la entrada, por lo que no se debe interpretar el resultado dependiendo del número de espacios.
Para ver solo un valor necesario, especifique la opción correspondiente.
wc -l notes.txt
wc -w notes.txt
wc -c notes.txt
Opciones principales de wc
| Opciones | Objetivo de cálculo | Puntos a tener en cuenta |
|---|---|---|
-l, --lines |
Número de caracteres de nueva línea | Si no hay nueva línea en la última fila, esa fila no se incluye |
-w, --words |
Número de palabras separadas por espacios | El juicio de los espacios en blanco puede verse afectado por la configuración regional |
-c, --bytes |
Número de bytes | Un carácter de múltiples bytes puede tener varios bytes |
-m, --chars |
Número de caracteres | Se ve afectado por la configuración regional actual y la codificación de caracteres |
-L, --max-line-length |
Ancho de visualización de la línea más larga | No es un simple recuento de caracteres y también considera tabulaciones y caracteres anchos |
--files0-from=ARCHIVO |
Lista de archivos separados por el carácter NUL | Opción de extensión de GNU y útil para manejar nombres de archivos con caracteres especiales |
También se pueden especificar varias opciones juntas. El orden de salida no se determina por el orden en que se escriben las opciones, sino por el número de líneas, palabras, caracteres, bytes y longitud máxima de línea. La definición exacta y las opciones de extensión de GNU se pueden verificar en la documentación oficial de wc de GNU Coreutils.
Cómo contar el número de líneas con precisión
wc -l cuenta los caracteres de nueva línea
wc -l muestra la cantidad de caracteres de nueva línea en la entrada, no el número lógico de líneas. En archivos de texto normales, cada línea termina con una nueva línea, por lo que el resultado suele coincidir con el número de líneas, pero si la última línea no tiene nueva línea, puede aparecer una menos que las líneas visibles.
wc -l access.log
Se puede determinar si un archivo de texto termina con una nueva línea verificando el último byte de la siguiente manera. Si el resultado es 0a, termina con un salto de línea LF.
tail -c 1 notes.txt | od -An -t x1
Mostrar solo números sin nombre de archivo
Si se pasa un archivo como argumento, el nombre del archivo aparecerá después del resultado. Si solo desea almacenar el número en una variable de shell, use la redirección de entrada estándar.
line_count=$(wc -l < notes.txt)
printf '%s\n' "$line_count"
GNU wc muestra un valor sin espacios en frente cuando se imprime un solo valor, pero si el script considera otras implementaciones, es seguro verificar el formato numérico por separado.
Diferencia entre el número de bytes y el número de caracteres
-c cuenta los bytes de almacenamiento
wc -c cuenta el número de bytes de la entrada. Es adecuado para verificar el tamaño del archivo en bytes o calcular el tamaño real de los datos que se van a transmitir.
wc -c document.txt
Si solo se necesita el tamaño que informa el sistema de archivos, stat puede ser más adecuado porque obtiene el valor de los metadatos sin leer todo el archivo.
stat -c '%s' document.txt
-m cuenta los caracteres según la configuración regional
wc -m calcula el número de caracteres según la configuración regional y la codificación actuales. En UTF-8, una letra en inglés normalmente ocupa 1 byte, pero un carácter en coreano generalmente ocupa 3 bytes, por lo que los resultados de -c y -m pueden diferir en el mismo archivo.
printf 'Linux 한글\n' | wc -c
printf 'Linux 한글\n' | wc -m
Con UTF-8 y una configuración regional compatible, los ejemplos producen 13 bytes y 9 caracteres, incluido el salto de línea. Se conserva el texto coreano para mostrar dos caracteres de tres bytes cada uno. Compruebe locale: una codificación incorrecta puede cambiar el resultado. Además, los caracteres que cuenta -m no equivalen siempre a símbolos percibidos por una persona: una letra y su acento combinante pueden contarse por separado.
¿Cómo se cuenta el número de palabras?
wc -w cuenta el número de cadenas no vacías separadas por espacios. Los espacios o tabulaciones consecutivos actúan como delimitadores, y no se eliminan los signos de puntuación ni se analiza la morfología del idioma.
printf 'one two\tthree\n' | wc -w
3
wc -w puede no ser adecuado para el análisis del lenguaje natural o el cálculo preciso del número de tokens en idiomas donde las palabras no están claramente separadas por espacios. En este caso, se debe usar un analizador morfológico o un parser adecuado al propósito.
Verificar la cantidad y el total de varios archivos
Resultados por archivo y fila total
Si se especifican varios archivos, se añadirá una fila total con el total general después de los resultados de cada archivo.
wc -l january.log february.log march.log
120 january.log
135 february.log
98 march.log
353 total
Especificar el modo de total con la opción --total de GNU
Las versiones más recientes de GNU wc permiten controlar el modo de impresión de la fila de total mediante --total=auto, always, only, never. Si solo se necesita el número total, se puede usar de la siguiente manera.
wc -l --total=only january.log february.log march.log
--total es una función extendida de GNU y puede no estar presente en Coreutils antiguos u otros entornos tipo Unix. Si se necesita portabilidad, verifique la compatibilidad con wc --help y use el método para manejar la última línea de la salida existente.
Ejemplo práctico usando tuberías
Contar filas de resultados de búsqueda
Si pasa el resultado de grep a wc -l, puede contar el número de filas coincidentes.
grep 'ERROR' app.log | wc -l
Si solo necesita el número de filas coincidentes en un archivo, grep -c 'ERROR' app.log es más directo. Ambos métodos cuentan solo una vez cada línea, incluso si hay múltiples coincidencias del patrón en una fila. Para más detalles sobre las búsquedas, consulte Uso del comando grep en Linux.
Verificar el número de filas de datos CSV
Si un archivo CSV tiene la primera fila como nombres de columnas, puede omitir el encabezado con tail -n +2 y luego contar las filas de datos.
tail -n +2 data.csv | wc -l
Para archivos donde se permiten saltos de línea reales dentro de los campos CSV, un registro puede ocupar varias filas físicas, por lo que este método no puede contar los registros con precisión. Para tales archivos, se debe usar un analizador CSV. La forma de especificar el rango en tail se puede consultar en Uso del comando tail en Linux.
Contar de forma segura nombres de archivos con caracteres especiales
La salida normal de find puede contar incorrectamente el número de elementos cuando los nombres de archivo contienen caracteres de salto de línea. En un entorno GNU, se puede utilizar un método que separa los nombres de archivo con un carácter NUL y luego cuenta el número de NUL.
find ./logs -type f -name '*.log' -print0 | tr -cd '\0' | wc -c
Es más seguro para los nombres de archivo que contienen espacios y saltos de línea que simplemente usar find ... | wc -l. El patrón de búsqueda *.log debe estar entre comillas para que el shell no lo expanda primero.
Verificar el número de procesos en ejecución
Si ps en GNU/Linux soporta --no-headers, se pueden contar las líneas de la lista de procesos excluyendo el encabezado.
ps -e --no-headers | wc -l
Es una instantánea en el momento de ejecutar el comando, y los resultados pueden variar según si se incluyen los procesos de la propia tubería o la implementación de ps. Al usarlo como un indicador de monitoreo, considere herramientas dedicadas o métodos de recopilación basados en /proc.
Ver la longitud de la fila más larga
wc -L calcula el ancho máximo que se muestra en la pantalla, no el número de bytes simples o caracteres de la fila más larga. GNU wc considera caracteres anchos según la configuración regional actual y calcula las posiciones de tabulación en unidades de 8.
wc -L table.txt
Por lo tanto, no se debe suponer que el resultado de -L sea igual a la longitud de caracteres obtenida con awk '{ print length }' o al número de bytes de wc -c. Para tareas que requieren un número exacto de caracteres, como la verificación del estilo de código, primero se debe comprobar cómo define la longitud la herramienta que se está utilizando.
Procesar muchos archivos de manera segura
Evitar el límite de longitud de la línea de comandos
Si hay demasiados archivos, la expansión de comodines en el shell puede exceder el límite de longitud de la línea de comandos. --files0-from=- de GNU wc lee la lista de archivos separados por NUL desde la entrada estándar para evitar este problema.
find ./logs -type f -name '*.log' -print0 | wc -l --files0-from=-
Este comando imprime el número de líneas de cada archivo de registro y su suma total. Incluso si los nombres de archivo contienen espacios o saltos de línea, se transmiten de manera segura usando el separador NUL.
Tener precaución con la suma dividida por xargs
find ... | xargs wc -l puede dividirse en múltiples ejecuciones de wc cuando hay muchos archivos. En este caso, cada ejecución genera su propio total, lo que hace difícil leer la suma total de inmediato. En un entorno GNU, --files0-from=- es más adecuado para agregar toda la lista de una sola vez.
Principios para usar en scripts de shell
Solicitar solo el valor necesario
No corte varias columnas de la salida wc sin opciones usando espacios; solicite solo los valores necesarios como -l, -w, -c. Si tampoco necesita el nombre del archivo, use redirección de entrada.
bytes=$(wc -c < archive.dat)
Distinguir entre error y 0
Un archivo vacío produce 0; un fallo de lectura es un error diferente. La asignación usada como condición del siguiente if conserva el estado de wc para decidir la rama. El ejemplo informa del error, pero su printf final puede devolver éxito: añada exit 1 en la rama de error si necesita que un script completo propague el fallo.
if count=$(wc -l < input.txt); then
printf 'lines=%s\n' "$count"
else
printf 'No se pudo leer input.txt.\n' >&2
fi
Malentendidos y precauciones frecuentes
El resultado de wc -l es uno menos de lo esperado
Es muy probable que la última línea no termine con un carácter de nueva línea. wc -l cuenta los caracteres de nueva línea, por lo que no incluye la última línea incompleta. Antes de cambiar arbitrariamente el formato original, verifique primero las reglas de salida generadas por el programa que creó el archivo.
Si hay caracteres coreanos, -c y -m son diferentes
-c cuenta bytes, y -m cuenta caracteres. En codificaciones de múltiples bytes como UTF-8, esto es una diferencia normal. Si el objetivo es el tamaño de almacenamiento, use -c; si el objetivo es el número de caracteres reconocibles por humanos, verifique la codificación y la configuración regional antes de usar -m.
¿Se puede contar el número de archivos con la salida de ls?
Para nombres de archivo normales, ls | wc -l parece simple, pero no es adecuado para automatización debido a nombres de archivo que incluyen alias, formatos de salida o saltos de línea. Use find, que puede especificar el tipo de archivo y la profundidad de búsqueda, y elija el modo de separación NUL si se manejan nombres de archivo arbitrarios.
Preguntas frecuentes
¿Qué se obtiene si se ejecuta wc sin opciones?
Por defecto, se muestran en este orden el número de líneas, palabras y bytes. Si se ha especificado un archivo como argumento, también se mostrará el nombre del archivo al final.
¿Cómo se ve el resultado de wc en un archivo vacío?
Un archivo completamente vacío tiene líneas, palabras y bytes todos en 0. Un archivo con solo un carácter de nueva línea tiene un resultado de wc -l que es 1, y el número de bytes puede variar según el formato de nueva línea utilizado.
¿Cuenta wc -w correctamente también las palabras en coreano?
wc -w cuenta cadenas separadas por espacios sin analizar el lenguaje. Si los espacios están colocados de acuerdo con el propósito de la entrada, se pueden usar como valor de referencia, pero no garantiza el número exacto de palabras según los morfemas o unidades de significado del coreano.
¿Se puede contar el número de líneas de un directorio en sí?
wc no es un comando para contar directamente los elementos de un directorio. Debe crear la lista de archivos deseada con find, etc., y luego agregar los resultados. Si los nombres de archivos pueden contener caracteres especiales, use caracteres NUL como separadores en lugar de saltos de línea.
Resumen
Se puede verificar el número de líneas con wc -l, el número de palabras con wc -w, el número de bytes con wc -c y el número de caracteres con wc -m. La salida sin opciones es en el orden línea, palabra y byte, y si se especifican varios archivos, se muestran los valores para cada archivo y el total acumulado.
Para obtener resultados precisos, recuerde que wc -l cuenta los caracteres de salto de línea, que los bytes y caracteres pueden diferir, y que la lista de nombres de archivos puede requerir separadores NUL. Para ver otras herramientas básicas, puede consultar Lista de comandos frecuentemente usados en Linux.




