带正则表达式的Grep返回所有内容

时间:2016-02-16 16:46:38

标签: regex perl

我试图从linux命令" passwd"获取日期。我正在做什么,我将用户存储在数组@user中,我想运行命令" passwd -S"对每个用户。当我运行" passwd -S user1"它返回:

user PS 2016-02-16 0 99999 7 -1 (Password set, SHA512 crypt.)

我想出了一个正则表达式,只能从该字符串中获取日期,正则表达式如下所示:'

\d{4}-\d{2}-\d{2}

然而,当我将它与grep相结合时,我似乎无法使其工作,它仍然输出" passwd"的完整输出。命令。这是代码:

PasswordAge();

sub PasswordAge {
    for my $loop (@user) {
        my $pass =qx(passwd -S $loop);
        my @splitpass = grep {/\d{4}-\d{2}-\d{2}/} $pass;
        print @splitpass;
    }
}

2 个答案:

答案 0 :(得分:5)

grep选择列表的元素。如果您想匹配字符串的一部分,请不要使用grep,请使用匹配:

sub PasswordAge {
    for my $user (@users) {
        my $pass = qx(passwd -S $user);
        my ($splitpass) = $pass =~ /(\d{4}-\d{2}-\d{2})/;
        print $splitpass;
    }
}

$ splitpass附近的括号强制列出赋值的上下文,其中匹配返回捕获的匹配。这就是我在括号中包围正则表达式的原因 - 他们创建了一个捕获组。

答案 1 :(得分:2)

虽然可以在这种情况下使用正则表达式,但实际上并不需要。您可以轻松使用split()

my $pass = 'user PS 2016-02-16 0 99999 7 -1 (Password set, SHA512 crypt.)';
my @parts = split(' ', $pass);
print "[$parts[2]]\n";

或者:

my $date = (split(' ', $pass))[2];
print "[$date]\n";

输出:

[2016-02-16]