Допустим, есть файл с 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
чтобы обойти это. Это должно быть допустимым, поскольку #
является частью переносимого набора символов, поэтому должно быть инвариантным для разных локалей в данной системе.