我有两个不同的用户列表。 我需要比较用户,并确保它们存在于两个文件中。 一个是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
您也可以对其进行分类和分类,以便获取完整的信息。