【问题标题】:Searching multiple patterns (words) with ack?用 ack 搜索多个模式(单词)?
【发布时间】:2014-10-09 10:02:04
【问题描述】:

我想在包含recursive directoriesfilesdirectory 中搜索多个patterns

我知道grep的命令如下

grep -e '(pattern1)|(pattern2)'

grep -r -E  'string1|string2|string3' /var/www/http

使用ackag 的命令是什么?

【问题讨论】:

    标签: linux grep ack ag


    【解决方案1】:

    这就够了:

    ack -R 'string1|string2'
    

    因为-R是默认的,所以可以省略:

    ack 'string1|string2'
    

    来自man ack

    -r-R、--recurse

    递归到子目录。这是默认设置,仅用于 与 grep 的兼容性。你也可以用它来转动 --no-recurse 关闭。


    如果您想从文件中获取模式,例如 /path/to/patterns.file,您可以使用:

    ack "$(cat /path/to/patterns.file)"
    

    或等效:

    ack "$(< /path/to/patterns.file)"
    

    我找不到与 grep -f 完全相同的内容。

    【讨论】:

    • 什么意思?将输出存储在文件中或从文件中读取模式?请在grep 中提供等效项,以准确了解您所指的功能。
    • grep -f pattern.txt之类的文件中读取模式,如果我将它们保存在文件中,是否有必要以^等特殊字符开始模式
    • @SandipPingle 嗯,我找不到等价物,所以我建议使用ack "$(&lt; /path/to/patterns.file)" * 获取它。查看更新。
    • ack "$(cat /path/to/patterns.file)" * 工作正常,通过将文件 | 中的模式保持分隔,如 pat1|pat2
    • 你知道有什么有效的方法可以将output 也保存在我目前正在使用ack "$(&lt; /path/to/patterns.file)" * &gt; output.txt 的文件中,但问题是读取/编辑output 文件很困难。
    【解决方案2】:

    ack 命令也可以与管道一起使用。 例如,第一个 ack 找到包含 pattern1 的文件,然后将其传送到另一个 ack 以仅在这些文件中搜索 pattern2

    ack -l 'pattern1' | ack -x 'pattern2'
    

    -l 参数意味着只列出匹配的文件(而不是匹配的文本)。 -x 参数意味着只搜索通过管道传输给它的文件。这类似于为下一次 ack 搜索缩小文件范围。

    ack -l 'pattern1' | ack -xl 'pattern2' | ack -x 'pattern3'
    

    这是一个 AND 运算符,而不是其他解决方案中给出的 OR 运算符。

    【讨论】:

      【解决方案3】:

      对于ag,从版本 0.19.2 开始,默认是递归搜索目录和文件。

      要搜索多个模式,可以使用类似ack的语法

      ag 'pattern1|pattern2'
      

      将同时搜索pattern1pattern2

      如果不想递归搜索,可以通过开关--depth NUM将搜索深度设置为1

      因此,

      ag 'pattern1|pattern2' --depth 1
      

      只会在当前目录中搜索这两种模式。

      【讨论】:

        【解决方案4】:

        我不知道为什么,但对于我的用例,管道解决方案不起作用。

        我只是将ack -l 的输出用作grep 的输入。例如快速查找所有包含string 1string 2的Javascript文件:

        grep "string 2" `ack -l --js "string 1"`
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-10-24
          • 2015-09-20
          • 1970-01-01
          • 2021-05-01
          • 2021-07-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多