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

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
    }
}'

命令细节说明

  1. 计算长度:先获取变量值的长度val_len,作为后续计算的基础
  2. 生成掩码串:用sprintf("%*s", n, "")生成n个空格的字符串,再用gsub把空格替换成*,实现任意数量的*填充
  3. 拼接输出:根据不同长度规则,拼接变量名、掩码串和保留的字符部分
  4. 边界处理:额外处理空值情况,避免出现异常输出

简化写法

如果追求更简洁的代码,可以合并重复逻辑:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:47:28