Linux 模式匹配日志文件

Linux 模式匹配日志文件,linux,perl,Linux,Perl,我在一个文件夹中得到了.log和_log这样的文件,我可以用/*.log$/选择.log文件,但找不到属于_log的文件 需要一个正则表达式模式,该模式将从指定文件夹中获取这两种类型的文件。使用regexp/.[.\u]log$/ 我很惊讶您的第一个案例成功了--/*.log$/不是合法的regexp(因为*没有说明它应该匹配的值为零或更多)。仔细检查您当前的结果。您的问题同时标记为“perl”和“linux”。在这里,我假设您讨论的是Perl风格的正则表达式,因为它看起来就像您在示例代码段中展

我在一个文件夹中得到了.log和_log这样的文件,我可以用/*.log$/选择.log文件,但找不到属于_log的文件


需要一个正则表达式模式,该模式将从指定文件夹中获取这两种类型的文件。

使用regexp
/.[.\u]log$/


我很惊讶您的第一个案例成功了--
/*.log$/
不是合法的regexp(因为
*
没有说明它应该匹配的值为零或更多)。仔细检查您当前的结果。

您的问题同时标记为“perl”和“linux”。在这里,我假设您讨论的是Perl风格的正则表达式,因为它看起来就像您在示例代码段中展示的一样

*。
序列是一个错误

让我们关注您想要匹配的内容。您希望匹配任何以点结尾,后跟文字字符“log”的文件名。您还希望匹配任何以下划线结尾,后跟文字字符“log”的文件名。你真的不应该担心最后一个点或下划线之前的“任何事情”。因此,regexp最好写为:

/[._]log$/
请注意,我们甚至都不关心点星。在这种情况下,这是没有帮助的

如果您希望您的模式也匹配文本字符“log”后面可能跟一个整数序列的文件(在您的问题中没有提到,但在后续注释中讨论过),您可以这样编写:

/[._]log\d*$/
这里的“明星”很有帮助;它允许在“g”和字符串末尾之间夹零个或多个数字。

我完全同意(通过向上投票)DavidO的解决方案,但使用glob()从特定目录获取文件列表通常更有意义,并增加可读性

my $dir = "/path/here";

my @log_files = grep { /[\._]log\d*$/ } glob("$dir/*");

print join "\n", @log_files;
这会抓住你的

foo.log
foo_log
foo.log1
foo_log22

谢谢sarnold,我的第一个结果成功了,但我会再次检查它。sarnold还有一件事,这个regex/*[.\u]log$/会选择像log1或.log1这样的文件,同样感谢DavidO,但我可能会得到像log1、log2和.log1、log2一样的文件,等等,然后看我的更新(你应该更新你的原始问题来提到这一点).似乎超出了这个问题的范围。