如何用Shell工具或jq从指定JSON中提取首个IP地址?
提取JSON中描述字段的第一个IP地址
需求:从固定JSON文件中提取description字段里的第一个IP地址(排除第二个),期望输出为10.199.157.67。
目标JSON内容:
{"result":[{"description": "Validate application after update for expected operation\nVM Name: fldcldswps7175 \nManaged Instance ID: i-01a2asda390b99 \nIP Address: 10.199.157.67,10.199.157.68","status":true}, {"name":"XML", "good":false}]}
尝试过的代码(未成功):
IPaddress=('.result'|grep "description"|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'|sed 's/,*$//g'|tr -d ',') echo $IPaddress
推荐方案:使用jq处理(最可靠)
jq是专门处理JSON的工具,能精准定位字段,避免正则处理JSON的风险:
jq -r '.result[0].description | split("\n")[] | select(startswith("IP Address: ")) | ltrimstr("IP Address: ") | split(",")[0]' input.json
逻辑说明:
.result[0].description:定位到第一个result对象的description字段split("\n")[]:按换行拆分描述内容,遍历每一行select(startswith("IP Address: ")):筛选出IP地址所在行ltrimstr("IP Address: "):去掉行首的前缀文本split(",")[0]:按逗号拆分IP列表,取第一个元素
如果直接使用JSON字符串而非文件,可执行:
echo '{"result":[{"description": "Validate application after update for expected operation\nVM Name: fldcldswps7175 \nManaged Instance ID: i-01a2asda390b99 \nIP Address: 10.199.157.67,10.199.157.68","status":true}, {"name":"XML", "good":false}]}' | jq -r '.result[0].description | split("\n")[] | select(startswith("IP Address: ")) | ltrimstr("IP Address: ") | split(",")[0]'
备选方案:使用grep+head(无jq环境适用)
如果系统未安装jq,可结合grep提取所有IP后取第一个:
grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' input.json | head -n1
逻辑说明:
grep -o:仅输出匹配到的IP字符串head -n1:提取第一行结果(即第一个IP)
若要精准匹配description字段中的IP(避免其他字段可能出现的IP),可执行:
grep -A1 '"description"' input.json | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | head -n1
内容的提问来源于stack exchange,提问作者Sayantan Jana
相关产品推荐
相关产品推荐

