模式匹配日志文件

时间:2012-06-12 09:48:33

标签: linux perl

我在文件夹中获取.log和_log等文件,我可以使用/*.log$/选择.log文件,但无法找到_log文件。

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

3 个答案:

答案 0 :(得分:3)

你的问题被标记为'perl'和'linux'。我在这里假设您正在谈论Perl样式的正则表达式,因为它看起来就像您在示例代码段中显示的那样。

*.序列是错误的。

让我们专注于您想要匹配的内容。您希望匹配以点结尾的任何文件名,后跟文字字符“log”。您还希望匹配以下划线结尾的任何文件名,后跟文字字符“log”。你真的不应该关注最后一点或下划线之前可能出现的“任何事物”。所以regexp可能会更好地写成:

/[._]log$/

请注意,我们甚至不打扰点星。在这种情况下没有用。

如果你想让你的模式也匹配文字,其中文字字符'log'可以选择后跟一个整数序列(在你的问题中没有提到,但在你的一个后续评论中讨论过),你可以把它写成这样:

/[._]log\d*$/

这里'star' 有帮助;它允许夹在“g”和字符串末尾之间的零个或多个数字。

答案 1 :(得分:1)

我完全同意(通过upvoting)与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

答案 2 :(得分:-1)

使用正则表达式/.*[._]log$/

我对你的第一个案例工作感到惊讶 - /*.log$/不是合法的正则表达式(因为*没有说它应该匹配零的 - 或更多)。仔细检查您当前的结果。