如何优雅转换id命令的组信息为指定输出格式?
简洁优雅的
id输出转换方案 你可以用单条awk命令完成这个转换,不需要繁琐的sed+awk组合,逻辑清晰还易读:
id | awk '{ sub(/.*groups=/, "") # 只保留groups后面的组列表内容 split($0, groups, /[(), ]+/) # 用括号、逗号、空格拆分内容到数组 for (i=1; i<=length(groups); i+=2) { if (groups[i] != "") # 过滤可能的空元素 printf "\047%s\047,%s\n", groups[i+1], groups[i] } }'
工作原理拆解:
sub(/.*groups=/, ""):把行中从开头到groups=的所有内容清空,只留下我们需要处理的组信息部分。split($0, groups, /[(), ]+/):将剩余的字符串拆分成数组groups,分隔符是括号、逗号、空格的任意组合,这样每个组的GID和名称会被拆成数组里的连续元素(比如545(Users)会变成groups[1]=545、groups[2]=Users)。- 循环遍历数组,每次步长为2,依次取出GID和组名,用
printf格式化输出成'组名',GID的格式,\047是单引号的转义写法,避免和shell的单引号语法冲突。
紧凑一行版:
如果喜欢更简洁的写法,可以压缩成一行:
id | awk '{sub(/.*groups=/,""); split($0,a,/[(), ]+/); for(i=1; i<=length(a); i+=2) if(a[i]!="") printf "\047%s\047,%s\n", a[i+1], a[i]}'
用你给出的输入测试,输出会和你需要的示例完全匹配。
内容的提问来源于stack exchange,提问作者bballdave025
相关产品推荐
相关产品推荐

