我正在寻找单词gmail
或outlook
目录。尽管其中有一些行被注释掉gmail
了outlook
。我该怎么grep
办?
我尝试了很多东西,但我想它会是这样的:
grep "^[^#;]" | egrep -i "gmail|outlook" *.ksh > a.log
答案1
和grep
:
grep -P '^(?=[\s]*+[^#])[^#]*(gmail|outlook)' file
-P
激活 Perl 兼容的正则表达式。^(?=...)
定义一个不属于模式一部分的捕获组(lookahead;Perl 扩展)。这^
意味着该行的开始。- 该组内部
\s
匹配任何空白字符,*+
匹配空白 0 次或多次,并且是贪婪的(Perl 扩展)。 [^#]
匹配任何非#
.
- 该组内部
[^#]*
在捕获组之外,我们再次匹配任何非#
0 次或多次的字符(gmail|outlook)
最后匹配gmail
或outlook
我制作了一个包含不同示例的测试文件:
$ cat file
# outlook
blah gmail # this should match
# gmail
# gmail
# foo
blah outlook # this should match
outlook blah # gmail - this should match
foobar # gmail
bar
another gmail # this should match
输出是:
blah gmail # this should match
blah outlook # this should match
outlook blah # gmail - this should match
another gmail # this should match
当然,您可以对所有*.ksh
文件运行此命令:
grep -P '^(?=[\s]*+[^#])[^#]*(gmail|outlook)' *.ksh > a.log
答案2
因此,您想要.ksh
在当前目录中的所有文件中搜索该字符串gmail
,并outlook
排除以 开头的行#
并将输出写入到a.log
.
好的grep -P "^(?=[^#])(.*gmail.*|.*outlook.*)" *.ksh > a.log
答案3
使用怎么样:
egrep "gmail|outlook" *.ksh | grep -v ^[#]
首先grep
获取包含“gmail”或“outlook”的所有行,第二个grep
忽略注释行