多个grep搜索/忽略模式

Rei*_*ica 20 unix shell command-line grep

我通常使用以下管道来搜索特定的搜索字符串,但忽略某些其他模式:

grep -Ri 64 src/install/ | grep -v \.svn | grep -v "file"| grep -v "2\.5" | grep -v "2\.6"
Run Code Online (Sandbox Code Playgroud)

这可以简洁地实现吗?我正在使用GNU grep 2.5.3.

Rob*_*lls 26

只需将未过滤的输出传递到grep的单个实例中,并使用扩展的regexp来声明要忽略的内容:

grep -Ri 64 src/install/ | grep -v -E '(\.svn|file|2\.5|2\.6)'
Run Code Online (Sandbox Code Playgroud)

编辑:要搜索多个文件,也可以尝试

find ./src/install -type f -print |\
    grep -v -E '(\.svn|file|2\.5|2\.6)' | xargs grep -i 64
Run Code Online (Sandbox Code Playgroud)

编辑:哦.我忘了添加简单的技巧来阻止多个grep实例的可用性,即

ps -ef | grep something | grep -v grep
Run Code Online (Sandbox Code Playgroud)

用它代替

ps -ef | grep "[s]omething"
Run Code Online (Sandbox Code Playgroud)

消除了第二个grep的需要.

  • 必须引用括号..否则bash抱怨:意外令牌附近的语法错误`('' (2认同)
  • 您可能希望颠倒删除文件名和`xargs`的`grep -v`的顺序,以便`xargs`只获取您想要grep开始的文件. (2认同)

Fli*_*imm 8

使用该-e选项指定多个模式:

grep -Ri 64 src/install/ | grep -v -e '\.svn' -e file -e '2\.5' -e '2\.6'
Run Code Online (Sandbox Code Playgroud)

您可能还对该-F标志感兴趣,该标志表示模式是固定字符串而不是正则表达式.现在你不必逃避点:

grep -Ri 64 src/install/ | grep -vF -e .svn -e file -e 2.5 -e 2.6
Run Code Online (Sandbox Code Playgroud)

我注意到你正在掏出".svn".您可能希望在初始递归grep中跳过任何名为".svn"的目录.如果我是你,我会这样做:

grep -Ri 64 src/install/ --exclude-dir .svn | grep -vF -e file -e 2.5 -e 2.6
Run Code Online (Sandbox Code Playgroud)