我有两个文本文件,users.txt有1000个用户列表,groups.txt有50个组列表。我想运行一个命令,向每个组添加30个用户(例如:用户1-30到组1,用户31-60到组2,等等)。做这件事最实际的方法是什么?
这就是我目前所拥有的:

for i in `cat users.txt` ; do useradd $i; echo Pass$i | passwd $i -- stdin; done
for i in `cat groups.txt` ; do groupadd $i; done

最佳答案

假设您的文件每行有一个用户和一个组,下面是一个伪一行程序:

sed = groups.txt | while true ; do
  read line_no
  read group_name
  [ -z $line_no ] && break
  (( from = (line_no - 1) * 30 + 1 ))
  (( to = line_no * 30 ))
  sed -n "${from},${to} p" users.txt | xargs -r -n 1 usermod -a -G $group_name
done

此代码调用sed(1)groups.txt中的每一行打印行号(从1开始)和行本身(即组名),然后将输出管道设置为一个无休止的循环,该循环执行以下操作:
将管道输入中的行号读入$line_no变量
从管道输入读取组名到$group_name变量
如果$line_no为空,假设我们已到达groups.txt的结束,并且中断退出循环。
使用users.txt作为索引计算$line_no的起始行号和结束行号
调用sed(1)打印这些行之间的所有行
该用户名列表通过管道导入users.txt,每个用户名运行xargs(1),并从上面将其附加到usermod(8)$group_name开关告诉'-r'如果用户名/stdin为空,则不运行xargs(1)
编辑:用换行符替换分号以提高可读性

10-07 19:00
查看更多