Как к grep строкам, который не начинается “#\” или “”;?

Принятие Вас может позволить себе сохранить столько же сколько дедуплицированный файл в памяти (если Ваши данные действительно дублированы фактором 100, который должен составить приблизительно 20 МиБ + наверху), можно сделать это очень легко с Perl.

$ perl -ne 'print unless $dup{$_}++;' input_file > output_file

Это сохраняет порядок также.

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

Если Вы предпочитаете awk, это должно сделать это также (та же логика как версия жемчуга, то же упорядочивание, те же данные, собранные в dup переменная):

$ awk '{if (++dup[$0] == 1) print $0;}' input_file > output_file
80
12.01.2013, 15:29
7 ответов
grep "^[^#;]" smb.conf

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

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

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

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

или

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

Или

awk '$1 ~ /^[^;#]/' smb.conf
132
27.01.2020, 19:30
  • 1
    : cat /etc/samba/smb.conf | grep ^[^#\;] Но так или иначе спасибо –  denys 11.01.2013, 22:09
  • 2
    Да, или Вы могли использовать "кавычки"; я отредактировал это во впоследствии. –  goldilocks 11.01.2013, 22:11
  • 3
    @denys Вы неправы: ответ лютика золотистого в не худший, чем Ваш..1 Избегайте использования cat ...| синтаксис!..2 Для того, чтобы хлестать пустые строки И строки, содержащие только, располагают с интервалами, возможно, с комментариями, Вы могли использовать это: grep -v "^ *\(#.*\|\)$" < smb.conf –  F. Hauri 11.01.2013, 22:14
  • 4
    @EmanuelBerg Это - бесполезное ветвление. cat file | grep "blah" implie выполнение двух двоичных файлов через FIFO, в то время как grep "blah" <file сделайте точно то же и свяжите file естественно к grep's STDIN . [удар], которого бесполезная кошка является полнофункциональным предметом, перерывает любую поисковую систему!-> blog.sanctum.geek.nz/useless-use-of-cat... для образца –  F. Hauri 12.01.2013, 00:01
  • 5
    Это не делает точно того же. Это создает 2 процесса и канал, где 1 процесс достаточно. Прочитайте ссылку, данную в последнем комментарии @F.Hauri. –  rahmu 12.01.2013, 00:12
grep -v "^\s*[#;]" any.conf | grep -v "^\s*$"

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

2
27.01.2020, 19:30

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

[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]$
3
27.01.2020, 19:30

Трубка к grep в ответе Оливера Наджа может быть устранена (при использовании GNU grep или совместимого):

grep -v "^\s*[#\;]\|^\s*$" <some_conf_file>
3
27.01.2020, 19:30

решение Vim:

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

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

4
27.01.2020, 19:30
grep -v '^$\|^\s*#' temp

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

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

-1
27.01.2020, 19:30

Вот вариант получше (при условии, что GNU grep или совместимый):

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

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

0
27.01.2020, 19:30

Теги

Похожие вопросы