我想patterns
在directory
包含recursive directories
and中搜索多个files
。
我知道命令grep
如下
grep -e '(pattern1)|(pattern2)'
或者
grep -r -E 'string1|string2|string3' /var/www/http
使用ack
or的命令是什么ag
?
这应该足够了:
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
.
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 运算符。
对于ag
,从版本 0.19.2 开始,默认是递归搜索目录和文件。
要搜索多个模式,您可以使用类似的语法ack
ag 'pattern1|pattern2'
将同时搜索pattern1
和pattern2
。
如果不想递归搜索,可以通过开关设置搜索深度为1--depth NUM
所以,
ag 'pattern1|pattern2' --depth 1
只会在当前目录中搜索两种模式。
我不知道为什么,但对于我的用例,管道解决方案不起作用。
我只是将 的输出ack -l
用作 grep 的输入。例如,快速查找所有包含string 1
and的 Javascript 文件string 2
:
grep "string 2" `ack -l --js "string 1"`