¿Cómo contar líneas en un documento?


1078

Tengo líneas como estas, y quiero saber cuántas líneas tengo realmente ...

09:16:39 AM  all    2.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   94.00
09:16:40 AM  all    5.00    0.00    0.00    4.00    0.00    0.00    0.00    0.00   91.00
09:16:41 AM  all    0.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:42 AM  all    3.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:43 AM  all    0.00    0.00    1.00    0.00    1.00    0.00    0.00    0.00   98.00
09:16:44 AM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
09:16:45 AM  all    2.00    0.00    6.00    0.00    0.00    0.00    0.00    0.00   92.00

¿Hay alguna manera de contarlos todos usando comandos de Linux?


44
Abra el archivo usando vim, luego escriba g <Ctrl-g>, le mostrará el número de líneas, palabras, columnas y bytes
Luv33preet

31
@ Luv33preet luego te encuentras de nuevo en SO, buscando cómo salir de vim
Skylar Ittner

55
@SkylarIttner Y si necesita buscar cómo salir de vim, <esc> :q!esa es la única respuesta. (Esto es una broma, esto eliminará todos los cambios no guardados; la broma es que si no conoce vim es fácil estropear un archivo, así que es mejor no guardarlo).
Ryan

Respuestas:


2032

Uso wc:

wc -l <filename>

Esto generará el número de líneas en <filename>:

$ wc -l /dir/file.txt
3272485 /dir/file.txt

O, para omitir el <filename>uso del resultado wc -l < <filename>:

$ wc -l < /dir/file.txt
3272485

También puede canalizar datos a wc:

$ cat /dir/file.txt | wc -l
3272485
$ curl yahoo.com --silent | wc -l
63

18
¡¡esto es genial!! puede usar awk para deshacerse del nombre del archivo agregado al número de línea como tal:wc -l <file> | awk '{print $1}
CheeHow

80
Incluso más corto, podrías hacerlowc -l < <filename>
Tensigh

55
@ GGB667 también puede deshacerse del nombre del archivo concat <file> | wc -l
baptx

14
y con watch wc -l <filename>usted puede seguir este archivo en tiempo real. Eso es útil para archivos de registro, por ejemplo.
DarkSide

27
Tenga en cuenta que wc -l cuenta "nuevas líneas". Si tiene un archivo con 2 líneas de texto y un símbolo de "nueva línea" entre ellas, wc mostrará "1" en lugar de "2".
Konstantin

140

Para contar todas las líneas use:

$ wc -l file

Para filtrar y contar solo líneas con uso de patrón:

$ grep -w "pattern" -c file  

O use -v para invertir la coincidencia:

$ grep -w "pattern" -c -v file 

Consulte la página de manual de grep para ver los argumentos -e, -i y -x ...


Curiosamente a veces grep -cfunciona mejor para mí. Principalmente debido al wc -lmolesto prefijo de espacio de relleno de "características".
MarkHu


43

hay muchas maneras. usando wces uno.

wc -l file

otros incluyen

awk 'END{print NR}' file

sed -n '$=' file (GNU sed)

grep -c ".*" file

3
Sí, pero wc -l filele da el número de líneas Y el nombre de archivo para obtener solo el nombre de archivo que puede hacer:filename.wc -l < /filepath/filename.ext
ggb667

El uso del argumento GNU grep -H devuelve el nombre de archivo y el recuento. grep -Hc ".*" file
Zlemini

Voté estas soluciones porque wc -lcuenta los caracteres de nueva línea y no las líneas reales en un archivo. Todos los otros comandos incluidos en esta respuesta le darán el número correcto en caso de que necesite las líneas.
growlingchaos

27

La herramienta wces el "contador de palabras" en UNIX y sistemas operativos similares a UNIX, pero también puede usarlo para contar líneas en un archivo agregando la -lopción.

wc -l foocontará el número de líneas en foo. También puede canalizar la salida de un programa como este: ls -l | wc -lque le indicará cuántos archivos hay en el directorio actual (más uno).


3
ls -l | wc -l en realidad le dará el número de archivos en el directorio +1 para la línea de tamaño total. puede hacer ls -ld * | wc -lpara obtener la cantidad correcta de archivos.
Joshua Lawrence Austill

24

Si desea verificar la línea total de todos los archivos en un directorio, puede usar find y wc:

find . -type f -exec wc -l {} +


15

Si todo lo que desea es el número de líneas (y no el número de líneas y el estúpido nombre de archivo que regresa):

wc -l < /filepath/filename.ext

Como se mencionó anteriormente, estos también funcionan (pero son inferiores por otras razones):

awk 'END{print NR}' file       # not on all unixes
sed -n '$=' file               # (GNU sed) also not on all unixes
grep -c ".*" file              # overkill and probably also slower

3
Esta respuesta se publicó 3 años después de que se hizo la pregunta y solo está copiando otras. La primera parte es trivial y la segunda es toda la respuesta de ghostdog que estaba agregando. Votación a favor.
Fedorqui 'así que deja de dañar'

4 años en adelante ... downvoting. ¡Veamos si podemos obtener una racha de votos negativos de una década!
Damien Roche

1
No, estás equivocado; La respuesta de ghostdog no responde la pregunta original. Le da el número de líneas Y el nombre del archivo. Para obtener solo el nombre de archivo que puede hacer: filename.wc -l </filepath/filename.ext. Por eso publiqué la respuesta. awk, sed y grep son formas ligeramente inferiores de hacer esto. La forma correcta es la que enumeré.
ggb667

8

Usar nlasí:

nl filename

De man nl:

Escriba cada ARCHIVO en la salida estándar, con números de línea agregados. Sin FILE, o cuando FILE es -, lea la entrada estándar.


Esta es la primera respuesta que he encontrado que funciona con un archivo que tiene una sola línea de texto que no termina en una nueva línea, que wc -linforma como 0. Gracias.
Scott Joudry

7

He estado usando esto:

cat myfile.txt | wc -l

Lo prefiero a la respuesta aceptada porque no imprime el nombre de archivo, y no tiene que usarlo awkpara corregirlo. Respuesta aceptada:

wc -l myfile.txt

Pero creo que la mejor es la respuesta de GGB667:

wc -l < myfile.txt

Probablemente lo usaré de ahora en adelante. Es un poco más corto que mi camino. Estoy poniendo mi antigua forma de hacerlo en caso de que alguien lo prefiera. El resultado es el mismo con esos dos métodos.


3
El primer y el último método son iguales. el último es mejor porque no

5

Los anteriores son el método preferido, pero el comando "cat" también puede ser útil:

cat -n <filename>

Le mostrará todo el contenido del archivo con números de línea.


5

Vi esta pregunta mientras buscaba una forma de contar varias líneas de archivos, por lo que si desea contar varias líneas de un archivo .txt puede hacerlo,

cat *.txt | wc -l

también se ejecutará en un archivo .txt;)


5

wc -l No cuenta líneas.

Sí, esta respuesta puede llegar un poco tarde a la fiesta, pero todavía no he encontrado a nadie que documente una solución más sólida en las respuestas.

Contrariamente a la creencia popular, POSIX no requiere que los archivos terminen con un carácter de nueva línea. Sí, la definición de una línea POSIX 3.206 es la siguiente:

Una secuencia de cero o más caracteres que no sean <línea nueva más un carácter de terminación.

Sin embargo, lo que mucha gente no sabe es que POSIX también define POSIX 3.195 Incomplete Line como:

Una secuencia de uno o más caracteres que no son <newline> al final del archivo.

Por lo tanto, archivos sin un final LF son perfectamente compatibles con POSIX.

Si elige no admitir ambos tipos de EOF, su programa no es compatible con POSIX.

Como ejemplo, veamos el siguiente archivo.

1 This is the first line.
2 This is the second line.

No importa el EOF, estoy seguro de que estaría de acuerdo en que hay dos líneas. Lo descubriste mirando cuántas líneas se han iniciado, no mirando cuántas líneas se han terminado. En otras palabras, según POSIX, estos dos archivos tienen la misma cantidad de líneas:

1 This is the first line.\n
2 This is the second line.\n
1 This is the first line.\n
2 This is the second line.

La página del manual es relativamente clara sobre el wcrecuento de nuevas líneas, con una nueva línea que solo es un 0x0apersonaje:

NAME
       wc - print newline, word, and byte counts for each file

Por lo tanto, wcni siquiera intenta contar lo que podría llamar una "línea". Usar wcpara contar líneas puede conducir a un recuento incorrecto, dependiendo del EOF de su archivo de entrada.

Solución compatible con POSIX

Puede usar greppara contar líneas como en el ejemplo anterior. Esta solución es más robusta y precisa, y admite todos los diferentes tipos de lo que podría ser una línea en su archivo:

$ grep -c ^ FILE

4
cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+': SOLO para devolver los números de dígitos .


3

La redirección / canalización de la salida del archivo wc -ldebería ser suficiente, como la siguiente:

cat /etc/fstab | wc -l

que luego proporcionaría el no. de líneas solamente.


3

O cuente todas las líneas en subdirectorios con un patrón de nombre de archivo (por ejemplo, archivos de registro con marcas de tiempo en el nombre del archivo):

wc -l ./**/*_SuccessLog.csv

2

Sé que esto es viejo pero aún así: cuenta las líneas filtradas

Mi archivo se ve así:

Number of files sent
Company 1 file: foo.pdf OK
Company 1 file: foo.csv OK
Company 1 file: foo.msg OK
Company 2 file: foo.pdf OK
Company 2 file: foo.csv OK
Company 2 file: foo.msg Error
Company 3 file: foo.pdf OK
Company 3 file: foo.csv OK
Company 3 file: foo.msg Error
Company 4 file: foo.pdf OK
Company 4 file: foo.csv OK
Company 4 file: foo.msg Error

Si quiero saber cuántos archivos se envían OK:

grep "OK" <filename> | wc -l

O

grep -c "OK" filename

2

cuenta el número de líneas y almacena el resultado en una variable, usa este comando:

count=$(wc -l < file.txt) echo "Number of lines: $count"


1

Como otros dijeron, wc -les la mejor solución, pero para referencia futura puede usar Perl:

perl -lne 'END { print $. }'

$.contiene el número de línea y el ENDbloque se ejecutará al final del script.


1
No funciona:dir | perl -lne 'END { print $. }' Can't find string terminator "'" anywhere before EOF at -e line 1.'
VeikkoW

1
@VeikkoW funciona para mí. Si está en Windows, se aplican diferentes reglas de cotización; pero el OP preguntó sobre Linux / Bash.
tripleee

1
perl -lne '}{ print $. 'hace lo mismo
Tom Fenech


1

wc -l <filename>

Esto le dará un número de líneas y un nombre de archivo en la salida.

P.ej.

wc -l 24-11-2019-04-33-01-url_creator.log

Salida

63 24-11-2019-04-33-01-url_creator.log

Utilizar

wc -l <filename>|cut -d\ -f 1

para obtener solo un número de líneas en la salida.

P.ej.

wc -l 24-11-2019-04-33-01-url_creator.log|cut -d\ -f 1

Salida

63


¿Dónde está el beneficio de repetir la respuesta aceptada (diez años)?
jeb

Porque no pude encontrar el comando para obtener solo números de línea en la salida en este hilo.
Harsh Sarohi

Es el segundo ejemplo en la respuesta aceptada. wc -l < filename
jeb

wc -l <nombre de archivo> proporciona el nombre de archivo y el número de líneas en la salida.
Harsh Sarohi

No, wc -l < filenamees diferente wc -l filename, el primero usa la redirección y luego no hay ningún nombre de archivo en la salida, como se muestra en la respuesta del usuario85509
jeb

1

Esta función de shell portátil desplegable [ℹ]   funciona de maravilla . Simplemente agregue el siguiente fragmento a su .bashrcarchivo (o el equivalente para su entorno de shell) .

# ---------------------------------------------
#  Count lines in a file
#
#  @1 = path to file
#
#  EXAMPLE USAGE: `count_file_lines $HISTFILE`
# ---------------------------------------------
count_file_lines() {
    local subj=$(wc -l $1)
    subj="${subj//$1/}"
    echo ${subj//[[:space:]]}
}

Esto debería ser totalmente compatible con todos los shells compatibles con POSIX además de bash y zsh .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.