У меня есть несколько длинных файлов конфигурации , чтобы пройти, и я хотел бы видеть только то , что на самом деле активны в файле .conf
без какой - либо из #
тегов. Что я могу использовать для вывода строк без #
на нем? Я запускаю Debian Wheezy с этой командой.
2 ответа
grep -v '#' file
Вы должны заключить в кавычки #, потому что ваша оболочка может также интерпретировать это как комментарий.
Grep удалит любую строку с # на нем. Это может быть не то, что вы хотите. Что может быть более полезным, так это удаление комментариев. Вы можете использовать sed или «Stream EDitor». Это может дать вам то, что вы хотите.
sed -e 's/#.*//' < file | less
Регулярное выражение говорит: «найдите от символа комментария до конца строки и удалите его», а затем направьте на меньшее, чтобы его было легче прочитать.
Если комментарии всегда находятся в первом столбце, вы можете использовать метод, написанный @somequixotic, который показывает только те строки, в которых нет комментариев в первом столбце.
Если файл называется foo.conf
:
grep -E '^[^#].*' foo.conf
должен это сделать.
Объяснение:
-E
: Поддержка расширенных регулярных выражений!
'^[^#].*'
: Регулярное выражение, заключенное в одинарные кавычки.
^[^#].*
: Само регулярное выражение.
^
(в позиции 0 регулярного выражения): говорит «Совпадение, начинающееся с начала строки / первого символа, следующего сразу за новой строкой, или первого символа самого файла».
[^#]
: Говорит «Совпадение ровно с одним символом, который не является символом #
».
.*
: Говорит «Совпадение нуля или более любых символов, кроме новой строки, для остальной части строки».
Чистый эффект заключается в том, что если у вас есть файл с содержимым, подобным следующему:
#foo
bar
#baz
fly
Это регулярное выражение не будет соответствовать первой и третьей строкам, потому что первый символ в начале строк 1 и 3 на самом деле является #
, поэтому часть регулярного выражения, которая требует ровно одну не #
([^#]
) не соответствует, поэтому grep
исключает эту строку.
В этом случае регулярное выражение будет соответствовать остальным строкам, поскольку первый символ в начале строк 2 и 4 действительно не является #
.
Опираясь на наш успех, вы также можете сопоставить такие строки, как:
#I am tricky!
(Обратите внимание, что перед комментарием есть пробелы (табуляции или пробелы), и, поскольку это все еще комментарий, мы не хотим его!)
используя следующее:
grep -P '^\s*+[^#].*' foo.conf
(но .*
не является строго обязательным; я знаю, я знаю.)
Итак, теперь мы имеем:
-P
: Поддержка Perl-совместимых регулярных выражений ! (Подсказка: может не быть доступной повсеместно во всех версиях / реализациях grep
, но, по крайней мере, сейчас она доступна в GNU Grep.)
\s*+
: Небольшое добавленное регулярное выражение, которое говорит: «Сопоставьте ноль или более пробельных символов, означающих пробелы или табуляции, и если вы их видите, вы ДОЛЖНЫ съесть их». Эта последняя часть очень важна, потому что без собственнического квантификатора *+
пространство может совпадать как часть [^#]
, что могло бы обмануть регулярное выражение. Притяжательные квантификаторы не существуют в POSIX-совместимых (базовых или расширенных) разновидностях регулярных выражений, поэтому мы должны использовать PCRE здесь. Может быть способ сделать это без собственнического квантификатора, но я не знаю об этом.