Як підкреслити лінії, які не починаються з "#" або ";"?


78

Я хочу привітатись smb.confі бачити лише рядки, котрі не коментуються.


1
testparmзробіть це краще, оскільки для цього також відображаються значення за замовчуванням.
Ф. Хаурі

@ F.Hauri Дякую. він також працює. Але це також виробляти деякі непотрібні (в моєму випадку) інформацію, яка повинна бути grepped також ...
DENYS


Ще один спосіб через PCRE grep stackoverflow.com/a/45917459/3297613
Avinash Raj

Відповіді:


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 Ви помиляєтесь: реакція goldilocks не гірша за вашу. .1 Будь ласка, уникайте використання cat ...| синтаксису !. .2 Для збивання порожніх рядків І рядків, що містять лише пробіл, можливо, з коментарями U може використовувати це:grep -v "^ *\(#.*\|\)$" < smb.conf
F. Hauri

7
@EmanuelBerg Це марна вилка. cat file | grep "blah"implie запуск двох довічних файлів через ФІФО , а grep "blah" <fileробити те ж саме і зв'язати file naturaly з Grep х років STDIN. [bash] непотрібна кішка - це повнофункціональний предмет пошуку через будь-яку пошукову систему! -> blog.sanctum.geek.nz/useless-use-of-cat ... для зразка
Ф. Хаурі

2
Це не робить точно так само . Він створює 2 процеси і трубу, де достатньо 1 процесу. Прочитайте посилання, подане в останньому коментарі @ F.Hauri.
rahmu

4

Рішення Vim:

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

Я наткнувся на це питання, намагаючись сам знайти рішення vim.


1
Це також видалить рядки, які починаються з пробілів.
Kusalananda

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

3

Труба, яка має відповісти на відповідь Олівера Наджа, може бути усунена (припускаючи GNU grepабо сумісну):

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

Друга думка i @ nadj виглядає марною, відповідь @ goldilocks була більш ніж ефективною.
Архемар

1
Я погоджуюсь, що відповідь золотистого була правильною. Однак я також вважав корисним не показувати порожні рядки.
Morten Lind

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]$

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

[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
Який тип конф-файлів використовується <або /використовується для коментарів? Я знаю багато форматів файлів конф, де <є все, крім коментаря. !іноді використовується як у X-файлах ресурсів.
Стефан Шазелас


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

ця команда полягає в зібранні всієї інформації у файлі, виключаючи коментарі та порожні рядки.


2
Зауважте, що smb.conf також коментує;
Jeff Schaller

-3

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


Це нічого не робить для рядків, починаючи з ;.
Kusalananda
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.