在 grep 文件名中使用正则表达式

Using regex in grep filename

我想在多个反映不同服务器的存档日志文件夹中搜索某个字符串。我现在使用 2 个不同的命令

-bash-4.1$ zcat /mnt/bkp/logs/cmmt-54-22[8-9]/my_app.2021-12-28-* | grep 'abc'

-bash-4.1$ zcat /mnt/bkp/logs/cmmt-54-23[0-3]/my_app.2021-12-28-* | grep 'abc'

我基本上想搜索服务器文件夹 cmmt-54-228、cmmt-54-229 .... cmmt-54-233。

我尝试将这两个命令合二为一,但在我这边使用 regex 时似乎没有出现一些错误

-bash-4.1$ zcat /mnt/bkp/logs/cmmt-54-22[8-9]|3[0-3]/my_app.2021-12-28-* | grep 'abc'

请帮忙。

正则表达式不是 glob。请参阅 man 7 globman 7 regex

grep 与正则表达式。 grep 过滤 匹配某些正则表达式。

Shell 扩展您写的单词。 Shell 替换您写的包含“文件名扩展触发器”的内容 * ? [ 并且 用单词列表替换 该单词匹配的文件名。

您可以使用扩展模式匹配(参见man bash),这在这里听起来最自然:

shopt -s extglob
echo /mnt/bkp/logs/cmmt-54-2@(2[8-9]|3[0-3])/my_app.2021-12-28-*

在互动中shell我会写两次:

zcat /mnt/bkp/logs/cmmt-54-22[8-9]/my_app.2021-12-28-* /mnt/bkp/logs/cmmt-54-23[0-3]/my_app.2021-12-28-*

或使用大括号扩展(参见man bash):

zcat /mnt/bkp/logs/cmmt-54-2{2[8-9],3[0-3]}/my_app.2021-12-28-*

大括号扩展首先将单词替换为两个单词,然后文件名扩展将它们替换为实际文件名。

您还可以 find 带有 -regex 的文件。为此,请参阅 man find。 (或者输出文件名列表并将其通过管道传输到 grep,然后使用 xargs 或类似的方法将其传递给命令)