2014-09-01 32 views
1

不计我有这个文件:使用grep

$cat foo 
foo1 
foo2 
foo3 
foo4 
bar 

而且我想grep来打印

foo3 
bar 

所以基本上,我不知道如何排除所有的foo(其-v例如),除了 foo3。

+0

你是否也有'foo33',而且仍然只有'foo3'?由于这将打破这里发布的大多数解决方案(包括我的)。 – Jotne 2014-09-01 05:51:27

回答

1

这是可以做到的:

grep -v '^foo[^3]$' foo 

你还在用-v排除国旗,但你只排除foo条目,如果他们跟随由非3

但是,虽然这将适用于您的给定的输入文件,您也可能想剥离foo对他们以及。如果这是需要的,请使用:

grep -v '^foo[^3]$' foo | grep -v '^foo$' 

或:

grep -Ev '^foo[^3]|foo$' foo 

如果你的要求变得更加复杂,它可能是更好的选择了一个更先进的工具。例如,上面的grep也会给你foo39。对于一个情况下,你想要的只有foo线foo3foo4,并且还希望所有非foo行,你可以使用awk

awk '/^foo[34]$/||!/^foo/{print}' foo 
+0

谢谢。现在我试图排除每一个foo **,除了**'foo3'和'foo4'之外,还有usig'|'和一个新的grep。 – uuuuv 2014-09-01 06:24:16

+0

@uuuuv:'grep -v'^ foo [^ 34] $'foo',但这可能应该是一个不同的问题:-)在评论中提出的问题是,你通常得到的暴露更少。 – paxdiablo 2014-09-01 06:32:14

+0

如果不是'foo4',我有'foo48'和'foo9'排除。由于'[^ 34],不被解释为'34'。 – uuuuv 2014-09-01 06:45:04

0

使用grep -v 'foo[^3]',它会做一个否定搜索。

0

您也可以采取直接的办法:

grep "foo3\|bar" # which is grep for foo3 or bar (must be double-quoted) 
+0

这将适用于特定的输入,但不会,如果你有像'baz'这样的行。 – paxdiablo 2014-09-01 05:42:47

+0

这就是要求:'我不知道如何排除foo3以外的所有foo(例如-v)。“# – Jotne 2014-09-01 05:46:38

+0

而你怎么读'例如'。你是否认为这意味着“寻求独家方式”或者在“采取一种方法”的语法正确的语境中?或者你甚至不知道区别? – 2014-09-01 06:33:50

0

这里是一个awk你可以使用:

awk '!/foo[^3]/' file 
foo3 
bar 
0

你可以试试它使用负先行grep命令下面,

$ grep -vP '^(?!foo3)foo.*$' file 
foo3 
bar 

它匹配除字符串0123之外的所有foo字符串字符串。通过-v参数反转匹配会为您提供所需的输出。