grep für alle Zeilen, die ein bestimmtes Wort nicht enthalten

grep für alle Zeilen, die ein bestimmtes Wort nicht enthalten

Ich habe eine Datei fileA.txt

Batman.plist
Green Arrow.plist
Hawkgirl.plist
EOPrototypes.plist
Person.plist
EOPrototypes.plist
EOJavellinPrototypes.plist
Sinestro
Slomon Grundy.plist
Batman Beyond.plist
EORedRobin
EORavenPrototypes.plist

Wenn ich nun alle Zeilen abrufen möchte, die mit enden plistund das Wort nicht enthalten Prototype, habe ich bisher

grep -v "Prototype" fileA.txt | grep -E "*plist$"

Und die Ausgabe ist

Batman.plist
Green Arrow.plist
Hawkgirl.plist
Person.plist
Slomon Grundy.plist
Batman Beyond.plist

Und das ist genau das, was ich will.

Aber gibt es einen besseren Weg, dies zu tun?

Antwort1

grep -v Prototype | grep 'plist$'

ist wahrscheinlich das Beste, was es gibt. Sie können es mit einem Befehl mit sedoder tun awk(oder mit nicht standardmäßigen Erweiterungen, grepwie andere bereits gezeigt haben):

sed '/Prototype/d;/plist$/!d'

Oder

awk '/plist$/ && ! /Prototype/'

Aber das ist nicht unbedingt effizienter.

Antwort2

Versuche dies

grep -P '^(?!.*Prototype).*plist$' fileA.txt

Antwort3

Wenn der PrototypesString immer genau dem .plistString vorangestellt ist, wie in Ihrem Beispiel gezeigt, und die Version von grep Ihrer Plattform den PCRE-Modus unterstützt, könnten Sie einen negativen Lookbehind im Perl-Stil verwenden, wie grep -P '(?<!Prototypes)\.plist$'z. B.

$ grep -P '(?<!Prototypes)\.plist$' fileA.txt
Batman.plist
Green Arrow.plist
Hawkgirl.plist
Person.plist
Slomon Grundy.plist
Batman Beyond.plist

verwandte Informationen