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


78

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


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


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

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.


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>

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


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

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.


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.


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


To nic nie robi dla linii zaczynających się od ;.
Kusalananda
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.