Я использую приведенную ниже команду для фильтрации файла по # и пустым строкам. Но как мы можем grep без комментариев и пустых строк в Linux с одним grep.

[root@localhost ~]# cat test | grep -v ^# | grep -v ^$

4 ответа4

1

рассмотрим файл:

valid config line 1
# Comment
valid config line 2 # Comment
Blank line between

These two
One space in the line between

These two

Если вы рассматриваете случаи:

  • Строки, начинающиеся с #
  • Пустые строки

Вы можете использовать cat file | grep -v '^$\|^#' или cat file | grep -v '^\($\|#\)'

И вы получите что-то вроде:

valid config line 1
valid config line 2 # Comment
Blank line between
These two
One space in the line between

These two

Однако я бы также рассмотрел строки, которые начинаются со строки конфигурации и затем имеют встроенный комментарий (поддерживаемый в нескольких файлах конфигурации), строки, которые не являются пустыми, но имеют только пробелы, для этого в одной команде я бы использовал sed:

cat file | sed '/^\(#\|[[:space:]]*$\)/d;s/#.*//g'

Получение:

valid config line 1
valid config line 2 
Blank line between
These two
One space in the line between
These two

объяснение

  • [[:space:]]*$ соответствует 0 или более пробелам до конца строки
  • ^\(a\|b\) сопоставляет строки, начинающиеся с a или b , используя # как a и [[:space:]]*$ как b будет соответствовать всем строкам, начинающимся с # , пустым строкам и строкам, в которых есть только пробелы ,
  • /match/d удаляет все совпадающие строки
  • ; отделяет команды sed
  • s/a/b/g заменяет a на b глобально. Использование #.* качестве a и пустого b удалит все соответствующие комментарии после строки.

Надеюсь, поможет. С уважением

1

Для простых случаев мой шаблон перехода к этому:

$ egrep '^[^#]'

Этот шаблон соответствует линиям, которые начинаются с некоторого символа ДРУГОГО, чем знак фунта.

Если вы расширите определение «пустой» строки, включив в нее строку, состоящую исключительно из пробелов, шаблон не будет выполнен, так как он будет соответствовать такой строке. Шаблон также завершается ошибкой, если вы разрешаете произвольный пробел перед знаком решетки в строке комментария (как это делают Apache, bash и другие).

Если эти случаи важны для вас, этот шаблон лучше:

$ egrep '^[[:blank:]]*[^[:blank:]#]'

Например:

$ cat test
# comment
  # spaces then comment
config # then comment
before empty line

after empty line
space only on next line


tab only on next line

$ egrep '^[[:blank:]]*[^[:blank:]#]' test
config # then comment
before empty line
after empty line
space only on next line
tab only on next line
$
1

IIUC, вы хотите показать непустые и некомментированные строки. Вы можете сделать это с -e используя одну команду grep :

grep -v -e "^#" -e "^$" test

Например, если ваш test выглядит так:

#a
uncommented line

#comment below blank line

вывод будет:

$ grep -v -e "^#" -e "^$" test
uncommented line
0

Понял!

[root@localhost ~]# cat file | grep -v ^'$\|#'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .