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

78

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

Denys
источник
1
testparmсделать это лучше, так как это отображает значения по умолчанию тоже.
Ф. Хаури
@ F.Hauri Спасибо. это тоже работает. Но это также дает некоторую ненужную (в моем случае) информацию, которая также должна быть найдена ...
denys
суперсет: любое регулярное выражение: superuser.com/questions/655715/regex-does-not-begin-by-pattern
Сиро Сантилли 事件 改造 中心 法轮功 六四 事件
Другой путь через 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]$
JungleMartin
источник
0

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

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

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

С. Венката Рамана
источник
2
В каком типе conf файлы используются <или /используются для комментариев? Я знаю много форматов conf файлов, где <есть все, кроме комментариев. !иногда используется как в файлах ресурсов X.
Стефан
-2
egrep -v "^#|^$" anyfile.txt

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

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

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

Avinasha
источник
Это никак не влияет на строки, начинающиеся с ;.
Кусалананда