Linux下如何打印带掩码值的环境变量名称?
Linux环境变量掩码格式化解决方案
需求概述
处理Linux环境变量输出,对变量值按以下规则掩码:
- 变量值长度大于5:仅保留最后3个字符,前面用
*填充至原长度(如qwerty→***rty) - 变量值长度≤5:仅保留最后1个字符,前面用
*填充至原长度(如zxc→**c) - 保留变量名不变,空值直接输出
示例输入
FOO=qwerty BAR=asdfghjkl BAZ=zxc
期望输出
FOO=***rty BAR=******jkl BAZ=**c
现有命令的不足
你当前的awk命令仅能处理值长度大于5的情况,完全遗漏了长度≤5的场景,也未处理空值:
env | awk -F= '{ if(length($2)>5) {printf("%s=***%s\n", $1, substr($2, length($2)-2))} }'
优化后的完整awk命令
以下命令覆盖所有场景,严格遵循需求:
env | awk -F= ' { val_len = length($2) # 处理值长度>5的情况 if (val_len > 5) { star_num = val_len - 3 # 生成对应数量的* stars = sprintf("%*s", star_num, "") gsub(/ /, "*", stars) printf "%s=%s%s\n", $1, stars, substr($2, val_len - 2) } # 处理值长度1-5的情况 else if (val_len >= 1) { star_num = val_len - 1 stars = sprintf("%*s", star_num, "") gsub(/ /, "*", stars) printf "%s=%s%s\n", $1, stars, substr($2, val_len) } # 处理空值或无值的情况 else { printf "%s=%s\n", $1, $2 } }'
命令细节说明
- 计算长度:先获取变量值的长度
val_len,作为后续计算的基础 - 生成掩码串:用
sprintf("%*s", n, "")生成n个空格的字符串,再用gsub把空格替换成*,实现任意数量的*填充 - 拼接输出:根据不同长度规则,拼接变量名、掩码串和保留的字符部分
- 边界处理:额外处理空值情况,避免出现异常输出
简化写法
如果追求更简洁的代码,可以合并重复逻辑:
env | awk -F= ' { l = length($2) if (l == 0) { print $0; next } star_num = l > 5 ? (l-3) : (l-1) stars = sprintf("%*s", star_num, "") gsub(/ /, "*", stars) keep_chars = l > 5 ? substr($2, l-2) : substr($2, l) print $1 "=" stars keep_chars }'
内容的提问来源于stack exchange,提问作者Kirill
相关产品推荐
相关产品推荐

