grep para todas las líneas que no tienen una palabra en particular

grep para todas las líneas que no tienen una palabra en particular

Tengo un archivo 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

Ahora si quiero obtener todas las líneas que terminan en plisty no contienen la palabra Prototype. hasta ahora tengo

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

Y la salida es

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

Que es exactamente lo que quiero,

¿Pero hay una mejor manera de hacer esto?

Respuesta1

grep -v Prototype | grep 'plist$'

Probablemente sea tan bueno como parece. Puede hacerlo con un comando con sedo awk(o con extensiones no estándar grepcomo ya han mostrado otros):

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

O

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

Pero eso no necesariamente será más eficiente.

Respuesta2

Prueba esto

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

Respuesta3

Si la Prototypescadena siempre antepone exactamente la .plistcadena como se muestra en su ejemplo, y la versión de grep de su plataforma admite el modo PCRE, puede usar una búsqueda hacia atrás negativa de estilo perl, como por grep -P '(?<!Prototypes)\.plist$'ejemplo

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

información relacionada