使用ack同时搜索多个模式(单词)?

17

我想在一个包含递归目录和文件的目录中搜索多个模式

我知道使用grep命令的方式如下:

grep -e '(pattern1)|(pattern2)'
或者
grep -r -E  'string1|string2|string3' /var/www/http

使用 ackag 的命令是什么?

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完全等价的命令。


你的意思是什么?是将输出存储到文件中还是从文件中读取模式?请提供在 grep 中的相应等效功能以确切了解你所指的功能。 - fedorqui
从文件中读取模式,类似于 grep -f pattern.txt。如果我将它们保存在文件中,是否需要以某些特殊字符(如 ^)开头? - Sandip Pingle
1
ack "$(cat /path/to/patterns.file)" * 运行良好,将模式保存在文件中,使用 | 分隔,例如 pat1|pat2 - Sandip Pingle
дҪ зҹҘйҒ“дҝқжҢҒoutputж–Ү件зҡ„й«ҳж•Ҳж–№жі•еҗ—пјҹзӣ®еүҚжҲ‘жӯЈеңЁдҪҝз”Ёack "$(< /path/to/patterns.file)" * > output.txtпјҢдҪҶй—®йўҳжҳҜйҳ…иҜ»/зј–иҫ‘outputж–Ү件еҫҲеӣ°йҡҫгҖӮ - Sandip Pingle
@SandipPingle 你可以尝试使用-l--sort-files等参数。这取决于你想要的输出方式。仔细查看man ack - fedorqui
显示剩余3条评论

7

ack 命令也可以和管道一起使用。例如,第一个 ack 命令查找包含模式1的文件,然后将其传递给另一个 ack 命令,仅在这些文件中搜索模式2

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

-l参数表示仅列出匹配的文件(而不是匹配的文本)。-x参数表示仅搜索管道传输给它的文件。这类似于缩小下一次ack搜索的文件范围。

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

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


天啊!我一直在用“find”、“xargs”等工具瞎折腾,其实只需要用“ack”就能搞定了!:+1: - ssc

1
对于ag而言,从版本0.19.2开始,默认情况下会递归地在目录和文件中搜索。
要搜索多个模式,您可以使用类似于ack的语法。
ag 'pattern1|pattern2'

将会搜索pattern1pattern2

如果您不希望进行递归搜索,可以通过开关--depth NUM将搜索深度设置为1。

因此,

ag 'pattern1|pattern2' --depth 1

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

1
我不知道为什么,但对于我的用例,管道解决方案不起作用。
我只是将 ack -l 的输出用作 grep 的输入。例如,要快速查找包含 string 1string 2 的所有 JavaScript 文件:
grep "string 2" `ack -l --js "string 1"`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接