12

我想patternsdirectory包含recursive directoriesand中搜索多个files

我知道命令grep如下

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

或者

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

使用ackor的命令是什么ag

4

4 回答 4

19

这应该足够了:

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.

于 2014-10-09T10:10:46.650 回答
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 运算符。

于 2019-08-30T00:14:42.983 回答
1

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

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

ag 'pattern1|pattern2'

将同时搜索pattern1pattern2

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

所以,

ag 'pattern1|pattern2' --depth 1

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

于 2015-06-17T18:00:53.013 回答
1

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

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

grep "string 2" `ack -l --js "string 1"`
于 2019-02-06T20:00:51.333 回答