如何在Bash中用jq匹配username提取password_clear值
用jq按指定username提取对应password_clear的正确命令
原始JSON数据
{"id": "jboss_data1","DS1": {"policy_name": "CAT_LOCATION","username": "PRODUCTION_1","password_clear": "7bla1234"},"DS3": {"policy_name": "CAT_SRC","username": "PRODUCTION_2","password_clear": "foo7864"},"DS4": {"policy_name": "CAT_FOLDER","username": "PRODUCTION_3","password_clear": "123bar456"}}
问题分析
你之前的命令存在三个关键错误:
- 错误使用
.value.username:原始JSON中DS1/DS3/DS4直接是包含username的对象,没有value层级 - 错误引用变量:把
$user放在双引号里会被当作字符串字面量,而非传递的Bash变量 - 未过滤非对象节点:
.[]会遍历所有顶级键,其中id是字符串,会导致无效遍历报错
正确命令
推荐两种可靠写法:
写法一:遍历顶级对象并筛选
直接过滤掉非对象的顶级节点(比如id),再匹配username:
jq -r --arg user "${user_picked}" '.[] | select(type == "object" and .username == $user) | .password_clear' file.json
写法二:用to_entries遍历键值对
将顶级键值对转换为结构化条目,更清晰地定位目标对象:
jq -r --arg user "${user_picked}" 'to_entries[] | select(.value.username == $user) | .value.password_clear' file.json
命令说明
--arg user "${user_picked}":将Bash环境变量user_picked传递给jq,在jq内部用$user引用select(...):精准筛选出username匹配变量值的对象-r:输出原始字符串格式的密码,避免额外引号to_entries[]:把JSON的键值对转为{"key": "DS1", "value": {...}}格式,方便明确访问对象内容
示例
若user_picked="PRODUCTION_2",运行命令后会输出:
foo7864
内容的提问来源于stack exchange,提问作者Burps
相关产品推荐
相关产品推荐

