Wie grep Zeilen, die nicht mit "#" oder ";" beginnen?


78

Ich möchte smb.confnur Zeilen sehen, die nicht kommentiert sind.


1
testparmTun Sie dies besser, da dies auch Standardwerte anzeigt.
F. Hauri

@ F.Hauri Danke. es funktioniert auch. Es werden aber auch einige nicht benötigte (in meinem Fall) Informationen erzeugt, die auch abgegriffen werden sollten ...
verweigert am


Ein anderer Weg durch PCRE grep stackoverflow.com/a/45917459/3297613
Avinash Raj

Antworten:


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

Der erste ^bezieht sich auf den Zeilenanfang, sodass Zeilen mit Kommentaren, die nach dem ersten Zeichen beginnen, nicht ausgeschlossen werden. [^#;]bedeutet ein beliebiges Zeichen, das nicht #oder ;.

Mit anderen Worten, es werden Zeilen gemeldet, die mit einem anderen Zeichen als #und beginnen ;. Es ist nicht dasselbe wie das Melden von Zeilen, die nicht mit #und ;(für die Sie verwenden würden grep -v '^[#;]') beginnen, da Leerzeilen ebenfalls ausgeschlossen werden. Dies ist jedoch in diesem Fall wahrscheinlich vorzuziehen, da ich bezweifle, dass Sie sich für Leerzeilen interessieren.

Wenn Sie führende Leerzeichen ignorieren möchten, können Sie Folgendes festlegen:

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

oder

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

Oder

awk '$1 ~ /^[^;#]/' smb.conf

Die richtige Antwort ist: cat /etc/samba/smb.conf | grep ^[^#\;]Aber trotzdem Danke
verweigert den

Ja, oder Sie könnten "Anführungszeichen" verwenden; Das habe ich nachträglich bearbeitet.
Goldlöckchen

7
@denys Du liegst falsch: goldilocks Antwort ist nicht schlimmer als deine. .1 Bitte verwenden Sie keine cat ...| Syntax !. .2 Zum Auspeitschen von Leerzeilen UND Zeilen, die nur Leerzeichen enthalten, könnte u. U. Folgendes verwenden:grep -v "^ *\(#.*\|\)$" < smb.conf
F. Hauri

7
@EmanuelBerg Es ist eine nutzlose Gabel. cat file | grep "blah"implizite zwei binaries durch ein fifo laufen zu lassen , dabei grep "blah" <filegenau das gleiche zu tun und file natürlich an grep's zu binden STDIN. [bash] nutzlose Katze ist ein voll ausgestattetes Suchthema in jeder Suchmaschine! -> blog.sanctum.geek.nz/useless-use-of-cat ... zum Beispiel
F. Hauri

2
Es macht nicht genau das Gleiche . Es werden 2 Prozesse und eine Pipe erstellt, in der 1 Prozess ausreicht. Lesen Sie den Link in @ F.Hauris letztem Kommentar.
Rahmu

4

Vim-Lösung:

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

Ich bin über diese Frage gestolpert, als ich versucht habe, die vim-Lösung selbst zu finden.


1
Dies würde auch Zeilen löschen, die mit Leerzeichen beginnen.
Kusalananda

Wahr. Ich fand das nützlich für Konfigurationsdateien, da Zeilen zwischen Kommentaren ansonsten die Ausgabe füllen. Wenn Sie die Leerzeilen lieber beibehalten möchten, ändern Sie *sie +wie folgt:v/^\s+[#\n]/p
David Lord,

3

Die Pipe, mit der oliver nadj antworten soll, kann entfernt werden durch (vorausgesetzt, GNU grepoder kompatibel):

grep -v "^\s*[#\;]\|^\s*$" <some_conf_file>

Zweites Grep i @ nadjs sieht nutzlos aus, @ goldilocks Antwort war mehr als genug.
Archemar

1
Ich stimme zu, dass die Antwort von Goldlöckchen richtig war. Ich hielt es jedoch auch für sinnvoll, keine Leerzeilen anzuzeigen.
Morten Lind

2
grep -v "^\s*[#;]" any.conf | grep -v "^\s*$"

das funktioniert bei mir Ignorieren Sie kommentierte oder leere Zeilen, auch Leerzeichen vor der Raute oder dem Semikolon


2

Diese Beispiele könnten für Menschen von Nutzen sein.

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

Das erste grep-Beispiel schließt Zeilen aus, die mit Leerzeichen beginnen, gefolgt von einem Hash-Symbol.

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

Die zweite Option schließt Zeilen aus, die mit Leerzeichen beginnen, gefolgt von einem Hash-Symbol oder einem Semikolon.

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

[user@host tmp]$

0

Hier habe ich eine bessere (vorausgesetzt, GNU grepoder kompatibel):

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

Ausschluss für Zeilen, die #;/%<in eckigen Klammern beginnen und der zweite Filter nach der Pipe \s*$für Leerzeilen.


2
In welcher Art von Conf-Dateien werden <oder /für Kommentare verwendet? Ich kenne viele conf-Dateiformate, bei denen <alles andere als ein Kommentar ist. !wird manchmal wie in X-Ressourcendateien verwendet.
Stéphane Chazelas


-2
egrep -v "^#|^$" anyfile.txt

Mit diesem Befehl werden alle Informationen in der Datei mit Ausnahme von Kommentaren und Leerzeilen überprüft.


2
Beachten Sie, dass smb.conf auch mit;
Jeff Schaller

-3

Dies sollte Ihnen die Datei ohne die Zeilen anzeigen, die beginnen mit #: grep -v "^#" filename


Dies hat nichts mit Zeilen zu tun, die mit beginnen ;.
Kusalananda
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.