我希望我的 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
您可以使用grep
Perl 兼容 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();
}
}
程序
- 保存上述代码为
userlist.java
使用您喜欢的 Java IDE 编译并运行。如果您喜欢命令行,请执行
javac UserList.java && java UserList
输出将显示在 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]