Как получить строки, которые не начинаются с «#» или «;»?


78

Я хочу grep smb.confи видеть только строки, которые не комментируются.


1
testparmсделать это лучше, так как это отображает значения по умолчанию тоже.
Ф. Хаури

@ F.Hauri Спасибо. это тоже работает. Но это также дает некоторую ненужную (в моем случае) информацию, которая также должна быть найдена ...
denys


Другой путь через PCRE grep stackoverflow.com/a/45917459/3297613
Авинаш Радж

Ответы:


125
grep "^[^#;]" smb.conf

Первый ^относится к началу строки, поэтому строки с комментариями, начинающимися после первого символа, не будут исключены. [^#;]означает любой символ, который не является #или ;.

Другими словами, он сообщает о строках, начинающихся с любого символа, кроме #и ;. Это не то же самое, что сообщать о строках, которые не начинаются с #и ;(для которых вы будете использовать grep -v '^[#;]'), в том смысле, что они также исключают пустые строки, но это, вероятно, предпочтительнее в этом случае, так как я сомневаюсь, что вы заботитесь о пустых строках.

Если вы хотите игнорировать начальные пустые символы, вы можете изменить его на:

grep '^[[:blank:]]*[^[:blank:]#;]' smb.conf

или же

grep -vxE '[[:blank:]]*([#;].*)?' smb.conf

Или же

awk '$1 ~ /^[^;#]/' smb.conf

правильный ответ: cat /etc/samba/smb.conf | grep ^[^#\;]но все равно спасибо
отрицаю

Да, или вы могли бы использовать "цитаты"; Я редактировал это в последующем.
Златовласка

7
@denys Вы ошибаетесь: ответ Златовласки не хуже вашего. .1 Пожалуйста, избегайте использования cat ...| синтаксиса !. .2 Для взбивания пустых строк И строк, содержащих только пробел, возможно, с комментариями U может использовать это:grep -v "^ *\(#.*\|\)$" < smb.conf
F. Hauri

7
@EmanuelBerg Это бесполезная вилка. cat file | grep "blah"подразумевают запуск двух двоичных файлов через fifo , в то grep "blah" <fileже время делают точно так же и привязывают file естественно к grep STDIN. [bash] бесполезный кот - полнофункциональный объект поиска в любой поисковой системе! -> blog.sanctum.geek.nz/useless-use-of-cat ... для примера
Ф. Хаури

2
Это не делает то же самое . Он создает 2 процесса и трубу, где достаточно 1 процесса. Прочитайте ссылку, приведенную в последнем комментарии @ F.Hauri.
Рахму

4

Vim решение:

:v/^\s*[#\n]/p

Я наткнулся на этот вопрос, пытаясь найти решение VIM самостоятельно.


1
Это также удалит строки, начинающиеся с пробелов.
Кусалананда

Правда. Я нашел это полезным для конфигурационных файлов, поскольку строки между комментариями в противном случае заполняют вывод. Если вы предпочитаете оставлять пустые строки, измените *их +следующим образом:v/^\s+[#\n]/p
Дэвид Лорд

3

Канал к grep в ответе oliver nadj может быть устранен (при условии GNU grepили совместимости):

grep -v "^\s*[#\;]\|^\s*$" <some_conf_file>

Второй grep i @ nadj выглядит бесполезным, ответ @ goldilocks был более чем достаточно.
Архемар

1
Я согласен, что ответ Златовласки был правильным. Однако я также счел полезным не показывать пустые строки.
Мортен Линд

2
grep -v "^\s*[#;]" any.conf | grep -v "^\s*$"

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


2

Эти примеры могут быть полезны для людей.

[user@host tmp]$ cat whitespacetest
# Line 1 is a comment with hash symbol as first char

# Line 2 is a comment with hash symbol as second char
  # Line 3 is a comment with hash symbol as third char
        # Line 4 is a comment with tab first, then hash
        ; Line 5 is a comment with tab first, then semicolon. Comment char is ;
; Line 6 is a comment with semicolon symbol as first char
[user@host tmp]$

Первый пример grep исключает строки, начинающиеся с любого количества пробелов, за которым следует символ хеша.

[user@host tmp]$ grep -v '^[[:space:]]*#' whitespacetest

        ; Line 5 is a comment with tab first, then semicolon. Comment char is ;
; Line 6 is a comment with semicolon symbol as first char
[user@host tmp]$

Вторая исключает строки, начинающиеся с любого количества пробелов, за которым следует символ хеша или точка с запятой.

[user@host tmp]$ grep -v '^[[:space:]]*[#;]' whitespacetest

[user@host tmp]$

0

Здесь я получил лучший (предполагая GNU grepили совместимый):

grep -v '^[#;/%<]\|^\s*$' anyfile.conf

исключить для строк, которые начинаются с #;/%<квадратных скобок, а второй фильтр после трубы - \s*$для пустых строк.


2
В каком типе conf файлы используются <или /используются для комментариев? Я знаю много форматов conf файлов, где <есть все, кроме комментариев. !иногда используется как в файлах ресурсов X.
Стефан

-1
grep -v '^$\|^\s*#' temp

Это намного лучше, я получил его с https://stackoverflow.com/questions/17392869/how-to-print-a-file-exclusive-comments-and-blank-lines-using-grep-sed

Предполагается, что GNU grepили совместимый.


Вопрос также рассматривает строки, начинающиеся с ;комментария, который должен быть удален.
Кусалананда

-2
egrep -v "^#|^$" anyfile.txt

Эта команда позволяет получить всю информацию в файле, за исключением комментариев и пустых строк.


2
Обратите внимание, что smb.conf также комментирует;
Джефф Шаллер

-3

Это должно показать вам файл без тех строк, которые начинаются с #: grep -v "^#" filename


Это никак не влияет на строки, начинающиеся с ;.
Кусалананда
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.