在 bash 中比较两个用户列表

在 bash 中比较两个用户列表

我有两个不同的用户列表。我需要比较用户并确保他们存在于两个文件中。一个是 passwd 文件,另一个是平面文件,其中包含用户名和其他信息,我可以从中提取排序的用户名列表。

这给了我一个按顺序排列的用户名列表:

cat /etc/passwd | cut --fields=1 | sort -k1.2

有没有更好的方法可以做到这一点?第一,第二,我该如何将其与其他文件中的其他用户列表进行比较?如果用户不存在,我将把它添加到平面文件中。

答案1

这应该对你有用,使用 bash、diff、awk 和 sort 进行进程替换:

diff <(awk -F: '{print $1}' /etc/passwd | sort) <(sort your_other_list_file)

这假设您的your_other_list_file只包含用户名,每行一个。除非您发布示例行,否则无法帮助您解析。

答案2

comm -3 <( (cut -f1 -d: /etc/passwd | sort) ) <(sort file2)

我最喜欢这个,它只有一行,避免了 awk,并且comm为您提供了选项,让您可以为您提供 list1、list2 独有的条目,或者两者的共同条目。此外,在排序之前进行切割可以使排序处理更短的字符串,因此在较长的列表上可能会更快。

答案3

假设您的平面文件如下例所示:

data info username number status

然后你可以这样做:

join -v 1 -1 1 -2 3 <(sed 's/:/ /g' /etc/passwd | sort) <(sort your_file) >> your_file

这会将文件一 ( ) 中出现-v 1但文件二中未出现的行附加到文件二的末尾。匹配的字段是文件一的字段 1 和文件二的字段 3。该sed命令补偿了密码文件以冒号分隔和平面文件以空格分隔的情况。您可以调整字段编号和分隔符以满足您的需要。

答案4

如何使用diff?只需执行diff file_a file_b,您就会得到一个包含所有更改的 diff 文件。之后,您只需过滤一下即可+获取缺失的行。

请注意,为了diff正常工作,您可能需要先对其进行排序。

相关内容