如何在Ubuntu上的文件中使用逻辑AND条件搜索关键字?

时间:2013-04-10 09:30:21

标签: linux search ubuntu grep

我一直在尝试在我的Ubuntu文件中搜索多个关键字。我知道如何为一个文件做到这一点:

find /[myRep] -type f | xargs grep -rl "myFunction"

我想为两个关键字(例如myFunctionmyClass)执行此操作,以获取可在myFunction中实例化myClass的所有文件。

我试着用:

find /[myRep] -type f | xargs grep -rl "myFunction" | xargs grep -rl "myClass"

我得到了结果,但我不确定这是否准确。另外,我想知道是否有一种简单的方法可以在搜索中添加更多逻辑条件,例如“OR”或“NOT”命令......

2 个答案:

答案 0 :(得分:2)

使用Regex Alternation进行逻辑OR条件

如果您正在尝试查找包含“myFunction”或“myClass”的文件,则可以使用带有替换的扩展正则表达式例如:

# Using GNU Find and GNU Grep
find . exec grep --extended-regexp --files-with-matches 'myFunction|myClass' {} +

当将文件列表传递给grep时,这将显示包含任一单词的匹配文件。

逻辑AND更加狡猾

逻辑AND比较棘手,因为您必须考虑订购。你可以:

  1. 根据一组要求过滤文件,然后过滤另一组要求。
  2. 使用功能更全面的程序,您可以在其中存储状态。
  3. 作为第一种情况的一个简单例子:

    # Use nulls to separate filenames for safety.
    find /etc/passwd -print0 |
        xargs -0 egrep -Zl root |
        xargs -0 egrep -Zl www
    

    作为第二种情况的人为例子,你可以使用GNU awk:

    # Print name of current file if it matches both alternates
    # on different lines.
    find /etc/passwd -print0 |
        xargs -0 awk 'BEGIN {matches=0};
                      /root|www/ {matches+=1};
                      matches >= 2 {print FILENAME; matches=0; nextfile}'
    

答案 1 :(得分:0)

你的命令对我来说很好。首先grep所有文件以找到包含“myFunction”的文件然后通过另一个grep传递给“myClass”。因此,您最终会得到包含“myFunction”和“myClass”的文件。