好的,这是我的代码:Pastebin
我想要做的是从文件/ etc / passwd中读取并提取UID超过1000但小于65000的所有用户。对于这些用户,我还想打印出他们登录的次数。使用此当前代码,输出如下:
用户:15
用户:4
用户:4
这个问题是他们没有登录15次或4次,因为程序正在计算从“last”命令输出的每一行。因此,如果我运行命令“last -l user”,它将看起来像这样:
user pts/0 :0 Mon Feb 15 19:49 - 19:49 (00:00)
user :0 :0 Mon Feb 15 19:49 - 19:49 (00:00)
wtmp begins Tue Jan 26 13:52:13 2016
我感兴趣的部分是“用户:0”行,而不是其他行。这就是为什么程序输出数字4而不是1,就像它应该的那样。所以我想出了一个正则表达式,只得到我需要的部分,它看起来像这样:
\n(\w{1,9})\s+:0
但是我不能让它工作,我只会一直得到错误。 我希望有人可以帮助我。
答案 0 :(得分:1)
我认为这个正则表达式会做你想做的事:m/^\w+\s+\:0\s+/
根据您发布的代码,这里有一些对我有用的代码...如果您有任何疑问,请告诉我们! :)
#!/usr/bin/perl
use Modern::Perl '2009'; # strict, warnings, 'say'
# Get a (read only) filehandle for /etc/passwd
open my $passwd, '<', '/etc/passwd'
or die "Failed to open /etc/passwd for reading: $!";
# Create a hash to store the results in
my %results;
# Loop through the passwd file
while ( my $lines = <$passwd> ) {
my @user_details = split ':', $lines;
my $user_id = $user_details[2];
if ( $user_id >= 1000 && $user_id < 6500 ) {
my $username = $user_details[0];
# Run the 'last' command, store the output in an array
my @last_lines = `last $username`;
# Loop through the output from 'last'
foreach my $line ( @last_lines ) {
if ( $line =~ m/^\w+\s+\:0\s+/ ) {
# Looks like a direct login - increment the login count
$results{ $username }++;
}
}
}
}
# Close the filehandle
close $passwd or die "Failed to close /etc/passwd after reading: $!";
# Loop through the hash keys outputting the direct login count for each username
foreach my $username ( keys %results ) {
say $username, "\t", $results{ $username };
}
答案 1 :(得分:0)
所以答案是使用
my @lastbash = qx(last $_ | grep ":0 *:");
你的代码中的。
答案 2 :(得分:0)
您问题的最短修复方法是通过“grep”运行“last”输出。
my @lastbash = qx(last $_ | grep ' :.* :');