我需要计算/ etc / passwd中的用户帐户,用户组和缺少的信息 并用打印输出
示例中的passwd文件:
root:x:0:0:root:/root:/bin/bash
dnsmasq:x:106:65534:dnsmasq,,,:/var/lib/misc:/bin/false
libuuid:x:100:101::/var/lib/libuuid:
按行分隔":"我需要第1,3和5行
一直在搜索,无法找到一个aswer请帮助
答案 0 :(得分:0)
我假设您已经设法逐行读取passwd文件。将一行加载到var(例如$line
)之后,就可以使用split。
my ($user, $gid, $info) = (split /:/, $line)[0, 3, 4];
项目为零索引,因此第一个"列"是0。
修改强>
我不知道你是如何确定用户信息是否缺少"所以我把它排除在外,但你可以根据需要使用我用于帐户或组的相同技术。计算组时,您希望避免计算重复的组。为此,我将gid添加为哈希键。如果我们以后遇到同一个组,那么密钥已经存在,我们不会增加任何内容。稍后我们只计算钥匙。
校正... groupid实际上是第4列(分裂3)。第3列(拆分2)是用户ID,并且会有与帐户一样多的数量。
use strict;
use warnings;
open my $content, '<', '/etc/passwd'
or die "Could not open: $!";
my $accounts;
my %groups;
while( my $line = <$content>) {
# Increment user count
$accounts++;
# Get group add it to hash to avoid duplicates
my ($gid) = (split /:/, $line)[3];
$groups{$gid} = 1;
}
close $content;
printf("Number of accounts: %d\n", $accounts);
printf("Number of groups: %d\n", scalar keys %groups);