![grep 查找所有没有特定单词的行](https://linux22.com/image/38447/grep%20%E6%9F%A5%E6%89%BE%E6%89%80%E6%9C%89%E6%B2%A1%E6%9C%89%E7%89%B9%E5%AE%9A%E5%8D%95%E8%AF%8D%E7%9A%84%E8%A1%8C.png)
我有一个文件 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
现在,如果我想获取所有以 结尾plist
且不包含单词 的行Prototype
。到目前为止我已经
grep -v "Prototype" fileA.txt | grep -E "*plist$"
输出是
Batman.plist
Green Arrow.plist
Hawkgirl.plist
Person.plist
Slomon Grundy.plist
Batman Beyond.plist
这正是我想要的,
但有更好的方法吗?
答案1
grep -v Prototype | grep 'plist$'
可能已经是最好的了。您可以使用带有sed
或的一个命令来完成此操作awk
(或使用非标准扩展,grep
如其他人已经展示的那样):
sed '/Prototype/d;/plist$/!d'
或者
awk '/plist$/ && ! /Prototype/'
但这并不一定会更有效率。
答案2
尝试这个
grep -P '^(?!.*Prototype).*plist$' fileA.txt
答案3
如果Prototypes
字符串总是精确地作为字符串的前缀.plist
,如示例中所示,并且您的 grep 平台版本支持 PCRE 模式,则可以使用 perl 风格的负向后查找,grep -P '(?<!Prototypes)\.plist$'
例如
$ grep -P '(?<!Prototypes)\.plist$' fileA.txt
Batman.plist
Green Arrow.plist
Hawkgirl.plist
Person.plist
Slomon Grundy.plist
Batman Beyond.plist