我试图从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;
}
}
答案 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]