Bash如何从ini文件提取指定person的public段groups、age参数
问题诊断
你代码的核心问题有3个:
- awk 中
/pattern/格式的正则匹配规则不会识别-v传递的变量,/a/的写法是固定匹配包含字符a的行,你传的变量a根本没有生效,这是硬编码能跑、传变量就失效的直接原因。 - 你的 awk 匹配逻辑顺序有问题,会导致 public 段的首行被跳过,而且后续用
lines[1]、lines[4]这种硬编码下标取值的方式非常脆弱,只要段内出现空白行、键顺序变化就会直接取不到值。 - 变量扩展没有加引号,遇到带空格的路径/内容时会直接触发语法错误。
修复方案
适配原有循环逻辑的版本
保留你原来遍历persons数组的逻辑,修正 awk 变量匹配规则,同时改用键名匹配取值,不怕段内键顺序变化:
# 自定义要查询的person列表 persons=("person_0" "person_1" "person_2") file="txt.ini" for person in "${persons[@]}"; do echo "$person" # 用~运算符实现变量正则匹配 section_content=$(awk -v pub_sec="$person:public" -v pri_sec="$person:private" ' $0 ~ "^\[" pri_sec "\]$" {found=0} found {print} $0 ~ "^\[" pub_sec "\]$" {found=1} ' "$file") # 按键名匹配取值,不依赖行下标 grouplist_values="" age_values="" while IFS='=' read -r key val; do case "$key" in groups) grouplist_values="$val" ;; age) age_values="$val" ;; esac done <<< "$section_content" echo "Group list = $grouplist_values" echo "Age = $age_values" echo "" done
更高效的通用版本
不需要提前定义persons列表,一次 awk 调用就能解析整个ini文件的所有public段数据,自动适配任意数量的person条目:
file="txt.ini" awk ' # 匹配section头 /^\[.*\]$/ { sec = substr($0, 2, length($0)-2) split(sec, sec_arr, ":") cur_person = sec_arr[1] is_public = (sec_arr[2] == "public") next } # 只处理public段的非空行 is_public && NF { split($0, kv, "=") if (kv[1] == "groups") groups[cur_person] = kv[2] if (kv[1] == "age") age[cur_person] = kv[2] } # 输出所有结果 END { for (p in groups) { print p print "Group list = " groups[p] print "Age = " age[p] print "" } } ' "$file"
内容的提问来源于stack exchange,提问作者Gutek
相关产品推荐
相关产品推荐

