从文件计数出现次数到grep停止在一个字符

时间:2016-02-10 04:39:15

标签: linux perl

我需要计算/ 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请帮助

1 个答案:

答案 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);