2009-11-17 6 views

Antwort

10

Der folgende Befehl gibt mir alle Dateien, die das Muster nicht foo enthalten:

find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep 0 
+3

Sie möchten die Grep 0 am Ende zu Grep 0 ändern $ (sonst erhalten Sie fehlerhafte Übereinstimmungen für Dateien, deren Name das Zeichen 0 enthält). – clouseau

+6

@clouseau ist meistens richtig ... Allerdings würde 'grep '0 $'' Dateien mit einem Vielfachen von 10 Zeilen vergleichen! Sie brauchen 'grep ': 0 $'' am Ende, um nach einem expliziten ': 0' am Ende der Zeile zu suchen. Dann erhalten Sie nur Dateien mit übereinstimmenden Nullzeilen. – TrinitronX

+0

Das UNIX, auf dem ich bin, hatte keine Versionen von find oder grep mit diesen Optionen, also musste ich mit dem in anderen Kommentaren vorgeschlagenen "ack" -Befehl gehen. –

574

Wenn Ihr grep die -L (oder --files-without-match) Option:

$ grep -L "foo" * 
+27

oder das Äquivalent mit [ack] (http://betterthangrep.com/): 'ack -L 'foo'' – asymmetric

+1

Wie bereits an anderer Stelle erwähnt, hilft ack dabei, .svn (Subversion) -Dateien standardmäßig zu vermeiden. – GuruM

+6

@GuruM Dies kann in GNU Grep erfolgen, indem die Variable 'GREP_OPTIONS = 'exportiert wird - exclude-dir = .svn --exclude-dir = .git'': ^) – bufh

5

ich viel Glück hatte mit

grep -H -E -o -c "foo" */*/*.ext | grep ext:0 

Meine Versuche mit grep -v gab mir einfach alle Zeilen ohne "foo".

5

Sie müssen tatsächlich:

find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep :0\$ 
36

einen Blick auf ack nehmen. Es macht den .svn Ausschluss für Sie automatisch, gibt Ihnen Perl-Ausdrücke und ist ein einfacher Download eines einzelnen Perl-Programms.

Das entspricht dem, was Sie suchen sollten, in ack sein:

ack -L foo 
+4

Nein, das gibt alle Zeilen zurück, die nicht mit 'foo' übereinstimmen. was er sucht, ist 'ack -L foo' – asymmetric

11

Der folgende Befehl schließt die Notwendigkeit, dass die Entdeckung durch die svn Ordner zu filtern, um eine zweite grep verwenden.

grep -rL "foo" ./* | grep -v "\.svn" 
0

Der folgende Befehl könnte Ihnen helfen, die Zeilen zu filtern, die die Teilzeichenfolge "foo" enthalten.

cat file | grep -v "foo" 
+0

Dies druckt Zeilen, die nicht übereinstimmen, nicht Namen von Dateien, die keine Übereinstimmung in einer Zeile enthalten. Um Beleidigung der Verletzung hinzuzufügen, ist es ein [nutzloser Gebrauch von 'Katze'] (http://www.iki.fi/era/unix/award.html). – tripleee

-1
grep -irnw "filepath" -ve "pattern" 

oder

grep -ve "pattern" < file 

obige Befehl wird uns das Ergebnis als -v die Umkehrung des Musters durchsuchte findet

+0

Dies druckt die Zeilen, die das Muster nicht enthalten. Sie können die Option "-l" hinzufügen, um nur den Dateinamen zu drucken. aber das druckt immer noch die Namen von jeder Datei, die * any * Zeile enthält, die das Muster nicht enthält. Ich glaube, das OP möchte die Dateien finden, die keine Zeile enthalten, die das Muster enthält. – tripleee

1

Meine grep keine Option -L hat. Ich finde Abhilfe, um dies zu erreichen.

Die Ideen sind:

  1. alle Dateinamen, um die verdiente String in einen txt1.txt Dump enthält.
  2. dump den gesamten Dateinamen im Verzeichnis zu einem txt2.txt.
  3. machen Sie den Unterschied zwischen der 2-Dump-Datei mit Diff-Befehl.

    grep 'foo' *.log | cut -c1-14 | uniq > txt1.txt 
    grep * *.log | cut -c1-14 | uniq > txt2.txt 
    diff txt1.txt txt2.txt | grep ">" 
    
+0

Ich vergesse die Befehle, aber statt Dateinamen zu verwerfen, können Sie tatsächlich ein Diff zwischen zwei Ausgabeströmen machen (ich denke, Sie umgeben die Befehle in Klammern, und da ist auch irgendwo eine spitze Klammer), wenn Ihre Systeme dies unterstützen , was ich denke, ist die Frage, da es 'grep -L 'nicht unterstützt –

1

find *20161109* -mtime -2|grep -vwE "(TRIGGER)"

Sie können die Filter unter "finden" angeben und den Ausschluß Zeichenfolge unter "grep -vwE".Verwenden Sie mtime unter find, wenn Sie auch nach modifizierter Zeit filtern müssen.

+0

Dies scheint mir alle Zeilen ohne die Zeichenfolge zu zeigen, fragt das OP nur nach den Dateinamen. –

Verwandte Themen