我有两个文本文件,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)
。编辑:用换行符替换分号以提高可读性