Contar líneas en el archivo sin contar líneas vacías

Contar líneas en el archivo sin contar líneas vacías

Digamos que hay un archivo con 7 líneas. P.ej:

a
b
c
#

d
e

Cuando lo ejecuto grep -c '#' -c -v filenamehere me da 6 líneas.

Quiero que muestre 5 líneas para quitar ese espacio en blanco.

Respuesta1

Tu archivo tieneSietelíneas en él, pero desea contar las líneas que no están vacías y que no comienzan con #.

$ grep -c '^[^#]' file
5

Esto cuenta el número de líneas que contienen un carácter al principio que no es un #carácter.

La expresión [^#]coincide con un único carácter que no es #. La expresión completa ^[^#]coincide con un no #al comienzo de una línea.

Las líneas vacías no coinciden con esta expresión, ni tampoco las líneas que comienzan con #¹.

Si solo desea contar líneas que no estén vacías:

$ grep -c '.' file
6

Esto cuenta las líneas que contienen al menos un carácter.


Para completar, para contar líneas vacías:

$ grep -c -v '.' file
1

Para contar líneas que están vacías o que comienzan con #:

$ grep -c -v '^[^#]' file
2

Tenga en cuenta que ambas -cy -vson opciones "globales". Cambian el comportamiento de toda la grepoperación cuando se dan en la línea de comando. No tiene sentido especificarlo -cvarias -vveces y no aceptan argumentos de opciones.

También tenga en cuenta que si especifica el patrón o la expresión regular en cualquier lugar que no sea el primer argumento después de todas las opciones, utilícelo -e 'pattern'para grepsaber que este es el patrón con el que está buscando. Es decir, utilice cualquiera de los dos

grep -e '.' -c -v file

o

grep -c -e '.' -v file

o

grep -c -v '.' file

GNU grepreorganizará la línea de comando de tal manera que las opciones aparezcan antes de los operandos de nombre de ruta (a menos que POSIXLY_CORRECTestén configurados en el entorno), pero generalmente desea escribir código de shell portátil que funcione con cualquier grepimplementación.


¹ las líneas que comienzan con un carácter que no es un carácter (una secuencia de bytes que no forma un carácter válido en el mapa de encanto local del usuario) también se excluirían en la mayoría de greplas implementaciones. Puedes usar LC_ALL=C greppara solucionar eso. Esto debería ser algo válido, ya que #es parte del conjunto de caracteres portátiles, por lo que debería ser invariable en todas las configuraciones regionales de un sistema determinado.

información relacionada