如何在Shell脚本中解析文本嵌套列实现用户及所属组分配
问题背景
现有一份存储分组、团队、成员对应关系的文本文件,初始格式为大组条目下嵌套多个团队条目,每个团队条目下记录该团队的成员名单,需求为读取该文件批量创建操作系统用户,并为用户分配对应的所属组/团队,实现权限管控。
目前已将原始数据整理为结构化的usersfile.txt文件,数据格式规则为Group : Team : User,文件内容示例如下:
Group_A:Team_Red,Team_Green:worker_1,worker_2 worker_2,worker_3 Group_B:Team_Blue,Team_Black,Team_Grey:worker_4,worker_2 worker_5 worker_4,worker_6
参考Python实现逻辑
已编写完成对应解析逻辑的Python代码,核心处理流程为:
- 逐行读取文件内容,按冒号分割每行得到组名、逗号分隔的团队列表、空格分隔的各团队成员块
- 按索引匹配团队与对应的成员块,拆分每个块内逗号分隔的用户名
- 汇总生成每个用户对应的所属团队列表,后续调用
useradd命令创建用户并附加对应用户组
Python实现代码如下:
with open("usersfile.txt") as file: user_dict = {} for line in file: line = line.strip() cols = line.split(':') #get columns group = cols[0] teams = cols[1].split(',') users = cols[2].split(' ') #mkdir $group <--- directory created based off group name #determine which teams a user is part of for idx, members in enumerate(users): for member in members.split(','): #print(idx, group, teams[idx], member) user_dict.setdefault(member,[]).append(teams[idx]) #Now we have users and their team, we can create a user account and assign them to a team print(user_dict) for user in user_dict: print(f"ADDING USER {user} who is part of groups {user_dict[user]}") # In shell script I would then create users #echo " " #echo "ADDING USER: " $user #useradd $user -G $teams
代码运行输出如下:
{'worker_1': ['Team_Red'], 'worker_2': ['Team_Red', 'Team_Green', 'Team_Blue'], 'worker_3': ['Team_Green'], 'worker_4': ['Team_Blue', 'Team_Grey'], 'worker_5': ['Team_Black'], 'worker_6': ['Team_Grey']} ADDING USER worker_1 who is part of groups ['Team_Red'] ADDING USER worker_2 who is part of groups ['Team_Red', 'Team_Green', 'Team_Blue'] ADDING USER worker_3 who is part of groups ['Team_Green'] ADDING USER worker_4 who is part of groups ['Team_Blue', 'Team_Grey'] ADDING USER worker_5 who is part of groups ['Team_Black'] ADDING USER worker_6 who is part of groups ['Team_Grey']
Shell实现方案
以下脚本逻辑与上述Python实现完全一致,输出结果完全匹配:
#!/bin/bash declare -A user_map while IFS= read -r raw_line || [[ -n "$raw_line" ]]; do line=$(echo "$raw_line" | xargs) [[ -z "$line" ]] && continue IFS=':' read -r group team_seg member_seg <<< "$line" IFS=',' read -r -a team_arr <<< "$team_seg" IFS=' ' read -r -a member_block_arr <<< "$member_seg" # 如需创建组对应目录,放开下方注释即可 # mkdir -p "$group" for block_idx in "${!member_block_arr[@]}"; do target_team=${team_arr[$block_idx]} IFS=',' read -r -a member_arr <<< "${member_block_arr[$block_idx]}" for user in "${member_arr[@]}"; do [[ -z "$user" ]] && continue if [[ -z "${user_map[$user]}" ]]; then user_map[$user]="$target_team" else if [[ ",${user_map[$user]}," != *",$target_team,"* ]]; then user_map[$user]="${user_map[$user]},$target_team" fi fi done done done < usersfile.txt # 打印用户-组映射字典,和Python输出格式对齐 echo -n "{" first=1 for user in "${!user_map[@]}"; do [[ $first -eq 0 ]] && echo -n ", " first=0 team_fmt=$(echo "${user_map[$user]}" | awk -F',' '{printf "["; for(i=1;i<=NF;i++){if(i>1)printf ", "; printf "\x27%s\x27", $i} printf "]"}') echo -n "'$user': $team_fmt" done echo "}" # 打印用户添加提示,放开注释即可执行实际创建操作 for user in "${!user_map[@]}"; do teams=${user_map[$user]} team_fmt=$(echo "$teams" | awk -F',' '{for(i=1;i<=NF;i++){if(i>1)printf ", "; printf "\x27%s\x27", $i}}') echo "ADDING USER $user who is part of groups [$team_fmt]" # 实际创建用户需root权限执行,请提前创建好所有对应用户组 # echo "ADDING USER: $user" # useradd "$user" -G "$teams" done
脚本特性说明:
- 采用Bash关联数组存储用户与所属团队的映射,和Python字典逻辑完全对齐
- 严格遵循原解析规则:按冒号拆分行、逗号拆分团队/块内成员、空格拆分成员块,按索引一一匹配团队和对应成员
- 内置重复团队去重逻辑,避免同一用户重复加入同一个组
- 自动跳过空行、空字段,兼容行首尾空白字符
- 输出格式与原Python运行结果完全一致,放开注释即可直接执行用户创建、目录创建操作
注意:实际执行
useradd操作时需要使用root权限运行脚本,且提前创建所有涉及的团队用户组,避免命令执行报错。
内容的提问来源于stack exchange,提问作者Zizi96
相关产品推荐
相关产品推荐

