Подсчет строк в файле без учета пустых строк

Подсчет строк в файле без учета пустых строк

Допустим, есть файл с 7 строками. Например:

a
b
c
#

d
e

Когда я запускаю, grep -c '#' -c -v filenamehere он выдает мне 6 строк.

Я хочу, чтобы отображалось 5 строк, чтобы убрать это пустое пространство.

решение1

Ваш файл имеетСемьстроки в нем, но вы хотите подсчитать строки, которые не являются пустыми и не начинаются с #.

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

Подсчитывается количество строк, содержащих в начале символ, который не является #символом.

Выражение [^#]соответствует одному символу, который не является #. Полное выражение ^[^#]соответствует не- #в начале строки.

Пустые строки не соответствуют этому выражению, как и строки, начинающиеся с #¹.

Если вы просто хотите посчитать непустые строки:

$ grep -c '.' file
6

При этом учитываются строки, содержащие хотя бы один символ.


Для полноты картины подсчитаем пустые строки:

$ grep -c -v '.' file
1

Чтобы подсчитать пустые строки или строки, начинающиеся с #:

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

Обратите внимание, что и -cи -vявляются "глобальными" опциями. Они изменяют поведение всей grepоперации, когда задаются в командной строке. Не имеет смысла указывать -cили -vнесколько раз, и они не принимают аргументы-опции.

Также обратите внимание, что если вы указываете шаблон или регулярное выражение где-либо, кроме как в качестве первого аргумента после всех опций, то используйте , -e 'pattern'чтобы grepзнать, что это шаблон, по которому вы ищете. То есть, используйте либо

grep -e '.' -c -v file

или

grep -c -e '.' -v file

или

grep -c -v '.' file

GNU grepперестроит командную строку таким образом, что параметры будут располагаться перед операндами имени пути (если иное не POSIXLY_CORRECTустановлено в среде), но обычно требуется написать переносимый код оболочки, работающий с любой grepреализацией.


¹ строки, начинающиеся с несимвола (последовательности байтов, которая не образует допустимый символ в таблице символов локали пользователя), также будут исключены в большинстве grepреализаций. Вы можете использовать , LC_ALL=C grepчтобы обойти это. Это должно быть допустимым, поскольку #является частью переносимого набора символов, поэтому должно быть инвариантным для разных локалей в данной системе.

Связанный контент