Contar linhas no arquivo sem contar linhas vazias

Contar linhas no arquivo sem contar linhas vazias

Digamos que haja um arquivo com 7 linhas. Por exemplo:

a
b
c
#

d
e

Quando corro, grep -c '#' -c -v filenamehere ele me dá 6 linhas.

Quero que mostre 5 linhas para tirar aquele espaço em branco.

Responder1

Seu arquivo temSetelinhas nele, mas você deseja contar as linhas que não estão vazias e que não começam com #.

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

Conta o número de linhas que contêm um caractere no início que não é um #caractere.

A expressão [^#]corresponde a um único caractere que não é #. A expressão completa ^[^#]corresponde a um não- #no início de uma linha.

As linhas vazias não correspondem a esta expressão, nem as linhas que começam com #¹.

Se você quiser apenas contar linhas não vazias:

$ grep -c '.' file
6

Isso conta as linhas que contêm pelo menos um caractere.


Para completar, para contar as linhas vazias:

$ grep -c -v '.' file
1

Para contar linhas vazias ou que começam com #:

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

Observe que ambos -ce -vsão opções "globais". Eles mudam o comportamento de toda a grepoperação quando são fornecidos na linha de comando. Não faz sentido especificar -cou -vvárias vezes e eles não aceitam argumentos de opção.

Observe também que se você especificar o padrão ou expressão regular em qualquer lugar que não seja o primeiro argumento após todas as opções, use -e 'pattern'para grepsaber que esse é o padrão com o qual você está pesquisando. Ou seja, use qualquer

grep -e '.' -c -v file

ou

grep -c -e '.' -v file

ou

grep -c -v '.' file

O GNU grepreorganizará a linha de comando de forma que as opções venham antes dos operandos do nome do caminho (a menos que POSIXLY_CORRECTesteja definido no ambiente), mas geralmente você deseja escrever um código shell portátil que funcione com qualquer grepimplementação.


¹ linhas que começam com um não-caractere (uma sequência de bytes que não forma um caractere válido no charmap de localidade do usuário) também seriam excluídas na maioria das grepimplementações. Você pode usar LC_ALL=C greppara contornar isso. Isso deve ser válido, pois #faz parte do conjunto de caracteres portáteis e, portanto, deve ser invariável entre localidades em um determinado sistema.

informação relacionada