使用grep以递归方式在目录中搜索模式,同时排除其他模式

时间:2014-12-01 07:05:31

标签: regex bash grep

我想在目录中的所有文件中搜索模式。 我知道这可以通过

来实现
grep -r "<pattern1>"

但是我希望在所有具有pattern1的文件中显示所有行,并且没有第二种模式说出pattern2。

例如:

grep -r "chrome"

上面的命令打印所有包含“chrome”字样的行。但我想只打印那些有铬但不包含“chrome.storage.sync”的行。

2 个答案:

答案 0 :(得分:4)

您可以使用管道过滤掉行

grep "chrome" inputFile | grep -v "chrome\.storage\.sync"

来自手册页

   -v, --invert-match
              Invert the sense of matching, to select non-matching lines.

<强>测试

$ cat test
chrome
chrome chrome.storage.sync

$ grep "chrome" test | grep -v "chrome\.storage\.sync"
chrome

答案 1 :(得分:2)

如果您的grep支持P,那么您可以使用以下基于正则表达式的grep命令。

grep -Pr '^(?=.*chrome)(?!.*chrome\.storage\.sync)'

正则表达式:

^                        the beginning of the string
(?=                      look ahead to see if there is:
  .*                       any character except \n (0 or more
                           times)
  chrome                   'chrome'
)                        end of look-ahead
(?!                      look ahead to see if there is not:
  .*                       any character except \n (0 or more
                           times)
  chrome                   'chrome'
  \.                       '.'
  storage                  'storage'
  \.                       '.'
  sync                     'sync'
)                        end of look-ahead

更短的形式,

grep -Pr 'chrome(?!\.storage\.sync)'

(?!\.storage\.sync)否定前瞻断言匹配后的字符串可以是.storage.sync

之外的字符串