在bash中比较两个用户列表

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

这给了我一个用户名的sorting列表:

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

有没有更好的方法来做这个第一,然后第二我如何再比较其他用户列表从另一个文件? 如果用户不存在,我将把它添加到平面文件。

这应该适用于使用bash,diff,awk和sort进行replace:

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

这假定你的your_other_list_file只包含用户名,每行一个。 不能帮助你parsing,除非你发布一个示例行。

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

 data info username number status 

那么你可以这样做:

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

将文件2( -v 1 )中不出现在文件2中的行附加到文件2的结尾。 匹配的字段是文件1的字段1和文件2的字段3。 sed命令补偿以冒号分隔的密码文件,平面文件以空格分隔。 您可以调整字段编号和分隔符以满足您的需求。

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

我最喜欢这个,它是一个单线程,避免awk,并且comm给你选项给你list1,list2或者两者的共同点。 在sorting之前切割也会使得sorting的string更短,所以在更长的列表中可能会更快。

你可以很容易地看到哪些行不存在从一个文件到另一个文件:

 fgrep -vxf file1 file2 

它将显示file2中的行,但不会显示在file1中。 (注意参数的顺序)

如何使用diff ? 只要执行diff file_a file_b ,就会得到包含所有更改的diff文件。 之后,你可以简单地过滤一个+来获取缺less的行。

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

 cat /etc/passwd1 | cut -d':' -f1 | sort > passwd_file1 cat /etc/passwd2 | cut -d':' -f1 | sort > passwd_file2 diff passwd_file1 passwd_file2 

您也可以对其进行分类和分类,以便获取完整的信息。