我想在一个包含递归目录和文件的目录中搜索多个模式
。
我知道使用grep
命令的方式如下:
grep -e '(pattern1)|(pattern2)'
或者grep -r -E 'string1|string2|string3' /var/www/http
使用 ack
或 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 命令查找包含模式1的文件,然后将其传递给另一个 ack 命令,仅在这些文件中搜索模式2。
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
。
如果您不希望进行递归搜索,可以通过开关--depth NUM
将搜索深度设置为1。
因此,
ag 'pattern1|pattern2' --depth 1
ack -l
的输出用作 grep 的输入。例如,要快速查找包含 string 1
和 string 2
的所有 JavaScript 文件:grep "string 2" `ack -l --js "string 1"`
grep
中的相应等效功能以确切了解你所指的功能。 - fedorquigrep -f pattern.txt
。如果我将它们保存在文件中,是否需要以某些特殊字符(如^
)开头? - Sandip Pingleack "$(cat /path/to/patterns.file)" *
运行良好,将模式保存在文件中,使用|
分隔,例如pat1|pat2
。 - Sandip Pingleoutput
ж–Ү件зҡ„й«ҳж•Ҳж–№жі•еҗ—пјҹзӣ®еүҚжҲ‘жӯЈеңЁдҪҝз”Ёack "$(< /path/to/patterns.file)" * > output.txt
пјҢдҪҶй—®йўҳжҳҜйҳ…иҜ»/зј–иҫ‘output
ж–Ү件еҫҲеӣ°йҡҫгҖӮ - Sandip Pingle-l
,--sort-files
等参数。这取决于你想要的输出方式。仔细查看man ack
。 - fedorqui