You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:30:53