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 -c
e -v
são opções "globais". Eles mudam o comportamento de toda a grep
operação quando são fornecidos na linha de comando. Não faz sentido especificar -c
ou -v
vá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 grep
saber 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 grep
reorganizará a linha de comando de forma que as opções venham antes dos operandos do nome do caminho (a menos que POSIXLY_CORRECT
esteja definido no ambiente), mas geralmente você deseja escrever um código shell portátil que funcione com qualquer grep
implementaçã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 grep
implementações. Você pode usar LC_ALL=C grep
para 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.