¿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?

Alucard
fuente
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
usuario85509
fuente
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 ...

Lauro Oliveira
fuente
Curiosamente a veces grep -cfunciona mejor para mí. Principalmente debido al wc -lmolesto prefijo de espacio de relleno de "características".
MarkHu
75
wc -l <file.txt>

O

command | wc -l
John Kugelman
fuente
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
ghostdog74
fuente
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).

construido1n
fuente
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 {} +
Storen
fuente
21

Uso wc:

wc -l <filename>
Vivin Paliath
fuente
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
ggb667
fuente
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.

decimal
fuente
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.

Buttle Butkus
fuente
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.

Yogui
fuente
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;)

talsibony
fuente
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
Chiru
fuente
4
cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+': SOLO para devolver los números de dígitos .
AechoLiu
fuente
3
wc -l file.txt | cut -f3 -d" "

Devuelve solo el número de líneas

Umur Kontacı
fuente
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.

tk3000
fuente
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
jwebuser
fuente
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
Diego Fernando Villarroel Díaz
fuente
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"

Konstantin F
fuente
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.

Majid Azimi
fuente
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

Acabo de hacer un programa para hacer esto (con node)

npm install gimme-lines
gimme-lines verbose --exclude=node_modules,public,vendor --exclude_extensions=html

https://github.com/danschumann/gimme-lines/tree/master

Funkodebat
fuente
44
¿No es eso como usar un F16 para matar las malas hierbas del jardín?
Buttle Butkus
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

Haro Sarohi
fuente
¿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 .

blizzrdof77
fuente