I предположим, что вам уже удалось прочитать файл passwd по строкам. Когда у вас есть строка, загруженная в var (например, $line
), вы можете использовать split.
my ($user, $gid, $info) = (split /:/, $line)[0, 3, 4];
Элементы нулевой индексируются, так что первая «колонна» 0.
EDIT
Я не знаю, как вы определить, если информация о пользователе «отсутствует» поэтому я оставил это, но вы можете использовать те же методы, которые я использовал для учетных записей или групп в зависимости от ваших потребностей. Когда вы подсчитываете группы, вы хотите избежать подсчета повторяющихся групп. Для этого я добавляю gid как хэш-ключ. Если мы позже столкнемся с одной и той же группой, ключ уже существует, и мы ничего не увеличиваем. Позже мы просто посчитаем ключи.
Также исправление ... groupid - это фактически столбец 4 (split 3). Столбец 3 (split 2) - это идентификатор пользователя, и будет столько же, сколько есть учетных записей.
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);
Это помогает много, но проблема все еще граф, то Ouput должно быть что-то вроде 'Количество счетов: 22',' Количество групп: 12', 'Отсутствует информация: 2' – V3NG3FuL
Вы должны размещать кода, который у вас есть, поэтому люди могут точно видеть, как/где вы застреваете. – Joshua
Спасибо, много, что решил мою проблему. Отсюда легче определить недостающую информацию. благодаря – V3NG3FuL