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

Проблема в том, что микропрограмма EFI на вашем компьютере не может найти системный раздел EFI (ESP ). Желательно, чтобы ваш диск был разбит на разделы по схеме разделов GPT. Спецификация UEFI позволяет использовать схему разделов MBR/DOS, но тогда ESP должен быть основным разделом, иметь правильный тип и иметь установленный загрузочный флаг. См. также этот вопрос U&L .

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

10
28.07.2021, 11:27

Теги

Похожие вопросы