Negativer Abgleich mit grep (Abgleich von Zeilen, die nicht foo enthalten)

Ich habe versucht, die Syntax für diesen Befehl herauszufinden:

grep ! error_log | find /home/foo/public_html/ -mmin -60

oder

grep '[^error_log]' | find /home/baumerf/public_html/ -mmin -60

Ich muss alle Dateien sehen, die geändert wurden, außer denen mit dem Namen error_log.

[Ich habe hier darüber gelesen (http://www.robelle.com/smugbook/regexpr.html), aber nur ein "not"-Regex-Muster gefunden.

Kommentare zu der Frage (1)
Lösung

grep -v ist Ihr Freund:

grep --help | grep invert  

-v, --invert-match wählt nicht übereinstimmende Zeilen aus

Sehen Sie sich auch das verwandte -L (das Komplement von -l) an.

-L, --files-without-match gibt nur DATEINamen aus, die keine Übereinstimmung enthalten

Kommentare (9)

Sie können für diese Zwecke auch awk verwenden, da es Ihnen erlaubt, komplexere Prüfungen auf übersichtlichere Weise durchzuführen:

Zeilen, die nicht foo enthalten:

awk '!/foo/'

Zeilen, die weder "foo" noch "bar" enthalten:

awk '!/foo/ && !/bar/'

Zeilen, die weder foo noch bar enthalten und die entweder foo2 oder bar2 enthalten:

awk '!/foo/ && !/bar/ && (/foo2/ || /bar2/)'

Und so weiter.

Kommentare (1)

In Ihrem Fall wollen Sie vermutlich nicht grep verwenden, sondern stattdessen eine negative Klausel an den find-Befehl anhängen, z. B.

find /home/baumerf/public_html/ -mmin -60 -not -name error_log

Wenn Sie Platzhalter in den Namen einfügen wollen, müssen Sie diese ausschließen, z. B. um Dateien mit der Endung .log auszuschließen:

find /home/baumerf/public_html/ -mmin -60 -not -name \*.log
Kommentare (0)