在 /etc/passwd 中使用 grep 获取用户和系统用户列表,区分两者

在 /etc/passwd 中使用 grep 获取用户和系统用户列表,区分两者

我希望我的 grep 从 /etc/passwd 打印用户列表,并且我已经研究了 /etc/login.defs 的 minmax 值,以便我希望我的 grep 获取这些值:

# Min/max values for automatic uid selection in useradd
#
UID_MIN          1000
UID_MAX         60000
# System accounts
#SYS_UID_MIN          100
#SYS_UID_MAX          999

实际用户 ID 从 1000 开始到 60000 结束,系统用户 ID 从 100 开始到 999 结束。

所以我把我的脚本做成这样(警告西班牙语文本):

2)
echo 
echo "LISTA DE USUARIOS"
cat /etc/passwd | grep -E "*:[*-6][0-9][0-9][0-9][0-9]:*" | cut -d":" -f1
echo
echo "LISTA DE USUARIOS DEL SISTEMA"
cat /etc/passwd | grep -E "*:[1-9][0-9][0-9]:*" | cut -d":" -f1 
;;

显然它根本不起作用,而且 grep 对我来说很难,所以我不确定如何让它工作。我尝试(并且一直尝试)阅读其他人的解决方案,但如果我想要学习的话,我想我需要有人向我解释这一点。

如果可能的话,我会尽量避免使用 perl 领域。虽然我知道它以什么而闻名,但我还不能处理那么多。

如果您需要了解任何其他信息来帮助我,请告诉我。

谢谢!(这也是我在这里的第一篇帖子)

答案1

awk命令可实现您想要的功能。首先,您将记录分隔符设置为:FS=":"检查第三个元素是否为 1000-60000,如果是,则打印元素 1(用户名):

awk 'FS=":" {if ($3 > 999 && $3 < 60001) print $1}' < /etc/passwd

答案2

另一个awk 版本,带有数组。有点冗长,但有效

awk -F':' ' $3 >= 1000 && $1 != "nobody" {i++;humanuser[i]=$1 } $3 < 999 { k++;sysuser[k]=$1} END {printf"****HUMAN USERS\n";for (j=1;j<=i;j++) printf humanuser[j]" "; printf "\n*****SYSTEM USERS\n"; for(m=1;m<=k;m++) printf sysuser[m]" "}' /etc/passwd

示例输出:

****HUMAN USERS
xieerqi testuser 
*****SYSTEM USERS
root daemon bin sys sync games man lp mail news uucp proxy www-data backup list irc gnats libuuid syslog messagebus usbmux dnsmasq avahi-autoipd kernoops rtkit saned whoopsie speech-dispatcher avahi lightdm colord hplip pulse gdm 

答案3

您可以使用grepPerl 兼容 RegEx (PCRE):

  • 要获取用户名UID >= 1000

    grep -Po '^[^:]+(?=:[^:]+:\d{4,})' /etc/passwd
    
  • 要获取用户名100 <= UID <= 999

    grep -Po '^[^:]+(?=:[^:]+:\d{3})' /etc/passwd
    

这里-P表示 PCRE,-o表示我们只取匹配的部分。

  • ^[^:]+获取用户名,所有信息均先获取:

  • (?=)是零宽度正向前瞻模式,我们使用它来确保匹配用户名后的所需部分

  • :[^:]+:匹配:x:然后\d{4,}匹配四个或更多数字(>=1000

  • 另一方面,:[^:]+:匹配:x:\d{3}恰好匹配三位数字(100 to 999)。

答案4

免责声明:以下 Java 答案仅用于教育目的和编码乐趣。如果您投反对票,请在评论中解释原因。

代码

下面的代码从中读取每一行/etc/passwd,将该行拆分为以:作为分隔符的字符串,然后根据用户的 UID 将用户排序到适当的 ArrayLists 中。

包 com.askubuntu.users.serg;

导入 java.io.File;导入 java.io.FileNotFoundException;导入 java.io.IOException;导入 java.util.ArrayList;导入 java.util.Scanner;

/**
 * 
 * A program to sort human and system users from /etc/password
 * 
 * @author Serg Kolo
 *
 */
public class UserList {
    private static final String SEPARATOR = "=============";
    private static final int SYS_UID_MAX = 999;
    private static final int UID_MAX = 1000;
    private static final String FILENAME_PASSWD = "/etc/passwd";
    private static final String COLON = ":";
    private static final String NOBODY = "nobody";

    /**
     * 
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) {
        File f = new File(FILENAME_PASSWD);
        try (Scanner readFile = new Scanner(f)) {
            ArrayList<String> humanUsers = new ArrayList<>();
            ArrayList<String> systemUser = new ArrayList<>();

            while (readFile.hasNext()) {
                String[] field = readFile.nextLine().split(COLON);
                int uid = Integer.parseInt(field[2]);

                if (uid >= UID_MAX && (!NOBODY.equals(field[0]))) {
                    humanUsers.add(field[0]);
                } else if (uid <= SYS_UID_MAX) {
                    systemUser.add(field[0]);
                }
            }
            printUsers(humanUsers, "Human Users:");
            printUsers(systemUser, "System Users:");
        } catch (FileNotFoundException e) {
            System.err.println(e.getLocalizedMessage());
        }
    }

    /**
     * 
     * print users
     * 
     * @param users
     * @param header
     */
    private static void printUsers(ArrayList<String> users, String header) {
        System.out.println(header);
        System.out.println(SEPARATOR);
        System.out.println(users);
        System.out.println();
    }
}

程序

  1. 保存上述代码为userlist.java
  2. 使用您喜欢的 Java IDE 编译并运行。如果您喜欢命令行,请执行

    javac UserList.java && java UserList
    
  3. 输出将显示在 IDE 的控制台中

示例输出

Human Users:
=============
[xieerqi, testuser]
System Users:
=============
[root, daemon, bin, sys, sync, games, man, lp, mail, news, uucp, proxy, www-data, backup, list, irc, gnats, libuuid, syslog, messagebus, usbmux, dnsmasq, avahi-autoipd, kernoops, rtkit, saned, whoopsie, speech-dispatcher, avahi, lightdm, colord, hplip, pulse, gdm, sshd]

相关内容