簡體   English   中英

帶正則表達式的Grep返回所有內容

[英]Grep with regular expression returns everything

我正在嘗試從linux命令“ passwd”獲取日期。 我正在做什么,我將用戶存儲在@user數組中,我想在每個用戶上運行命令“ passwd -S”。 當ii運行“ 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;
    }
}

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強制列表上下文周圍的括號與賦值相關,其中匹配返回捕獲的匹配。 這就是為什么我將正則表達式括在括號中的原因-它們創建了一個捕獲組。

雖然您可以在這種情況下使用正則表達式,但實際上並不需要。 您可以輕松地使用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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM