Jak grepować linie, które nie zaczynają się od „#” lub „;”?

78

Chcę grep smb.confi zobaczyć tylko te wiersze, które nie są komentowane.

denys
źródło
1
testparmzrób to lepiej, ponieważ wyświetlają również wartości domyślne.
F. Hauri,
@ F.Hauri Dziękuję. to też działa. Ale generuje też trochę niepotrzebnych (w moim przypadku) informacji, które również należy odczytać ...
zaprzecza
superset: any regex: superuser.com/questions/655715/regex-does-not-begin-by-pattern
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Inna droga przez PCRE grep stackoverflow.com/a/45917459/3297613
Avinash Raj

Odpowiedzi:

125
grep "^[^#;]" smb.conf

Pierwszy ^odnosi się do początku linii, więc linie z komentarzami rozpoczynającymi się po pierwszym znaku nie zostaną wykluczone. [^#;]oznacza dowolny znak, który nie jest #lub ;.

Innymi słowy, zgłasza wiersze rozpoczynające się dowolnym znakiem innym niż #i ;. Nie jest to to samo, co zgłaszanie wierszy, które nie zaczynają się od #i ;(do których byś użył grep -v '^[#;]'), ponieważ wyklucza również puste wiersze, ale prawdopodobnie jest to lepsze w tym przypadku, ponieważ wątpię, czy zależy ci na pustych wierszach.

Jeśli chcesz zignorować wiodące puste znaki, możesz zmienić to na:

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

lub

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

Lub

awk '$1 ~ /^[^;#]/' smb.conf
Złotowłosa
źródło
właściwa odpowiedź brzmi: cat /etc/samba/smb.conf | grep ^[^#\;]Ale i tak dziękuję
den
Tak, możesz użyć „cudzysłowów”; Później to zredagowałem.
goldilocks
7
@denys Mylisz się: odpowiedź goldilocks nie jest gorsza niż twoja. .1 Unikaj używania cat ...| składni !. .2 Do bicia pustych linii ORAZ wierszy zawierających tylko spację, może z komentarzami U może użyć tego:grep -v "^ *\(#.*\|\)$" < smb.conf
F. Hauri
7
@EmanuelBerg To bezużyteczny widelec. cat file | grep "blah"implie uruchomione dwa pliki binarne przez FIFO , podczas gdy grep "blah" <filerobią dokładnie to samo i wiążą file naturaly grep-tych STDIN. [bash] bezużyteczny kot jest w pełni funkcjonalnym przedmiotem wyszukiwania w dowolnej wyszukiwarce! -> blog.sanctum.geek.nz/useless-use-of-cat ... dla próbki
F. Hauri 11.01.2013
2
Nie robi dokładnie tego samego . Tworzy 2 procesy i potok, w którym wystarczy 1 proces. Przeczytaj link podany w ostatnim komentarzu @ F.Hauri.
rahmu
4

Rozwiązanie Vim:

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

Natknąłem się na to pytanie, kiedy sam próbowałem znaleźć rozwiązanie vim.

David Lord
źródło
1
Spowodowałoby to również usunięcie wierszy rozpoczynających się spacjami.
Kusalananda
Prawdziwe. Uważam, że jest to przydatne w przypadku plików konfiguracyjnych jako linii między komentarzami, w przeciwnym razie wypełniają dane wyjściowe. Jeśli wolisz zachować puste wiersze, zmień to *na +:v/^\s+[#\n]/p
David Lord
3

Potok do grep w odpowiedzi Olivera Nadja można wyeliminować (zakładając GNU greplub zgodny):

grep -v "^\s*[#\;]\|^\s*$" <some_conf_file>
Morten Lind
źródło
Drugi grep i @ nadj wygląda bezużytecznie, odpowiedź @ goldilocks była więcej niż wystarczająca.
Archemar
1
Zgadzam się, że odpowiedź goldilocks była poprawna. Jednak uznałem również za przydatne, aby nie wyświetlać pustych linii.
Morten Lind,
2
grep -v "^\s*[#;]" any.conf | grep -v "^\s*$"

to działa dla mnie. zignoruj ​​komentarze lub puste linie, nawet białe spacje przed znakiem skrótu lub średnikiem

oliver nadj
źródło
2

Te przykłady mogą być przydatne dla ludzi.

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

Pierwszy przykład grep wyklucza linie rozpoczynające się od dowolnej ilości białych znaków, po których następuje symbol skrótu.

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

Drugi wyklucza linie rozpoczynające się od dowolnej ilości białych znaków, po których następuje symbol skrótu lub średnik.

[user@host tmp]$ grep -v '^[[:space:]]*[#;]' whitespacetest

[user@host tmp]$
JungleMartin
źródło
0

Tutaj mam lepszy (zakładając GNU greplub kompatybilny):

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

wyklucz dla linii, które zaczynają się od #;/%<nawiasów kwadratowych, a drugi filtr za rurą \s*$dla pustych linii.

S. Venkata Ramana
źródło
2
W jakim typie plików conf są <lub są /używane komentarze? Znam wiele formatów plików conf, w których <wszystko oprócz komentarza. !jest czasami używany jak w plikach zasobów X.
Stéphane Chazelas
-2
egrep -v "^#|^$" anyfile.txt

to polecenie służy do grepowania wszystkich informacji w pliku z wyjątkiem komentarzy i pustych wierszy.

Mustafa Hussein
źródło
2
Zauważ, że smb.conf komentuje również z;
Jeff Schaller
-3

Powinno to wyświetlić plik bez wierszy rozpoczynających się od #: grep -v "^#" filename

Avinasha
źródło
To nic nie robi dla linii zaczynających się od ;.
Kusalananda