我有两个不同的用户列表。我需要比较用户并确保他们存在于两个文件中。一个是 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
正常工作,您可能需要先对其进行排序。