如何用txt文件内容替换jq命令参数并批量执行查询?
问题描述
我当前执行的jq命令如下:
jq '.backups[] | select(.resource_name == "resource_name") | {BackupTime: .updated_at, DiskName: .resource_name}' js.json | head -4
想实现用list.txt文件里的每一行字符串,替换命令中.resource_name的取值,针对每行内容执行一次该jq命令。list.txt内容示例:
apple mango grapes
期望执行的命令形式类似:
jq '.backups[] | select(.resource_name == "apple") | {BackupTime: .updated_at, DiskName: .resource_name}' js.json | head -4
解决方案
方法1:Bash循环逐行处理
通过while read循环读取list.txt的每一行,用jq的--arg参数传递变量(避免字符串拼接的转义问题),逐行执行命令:
while read -r resource; do jq --arg res "$resource" '.backups[] | select(.resource_name == $res) | {BackupTime: .updated_at, DiskName: .resource_name}' js.json | head -4 done < list.txt
方法2:jq一次性批量处理(高效版)
如果不想重复启动jq进程,可以把list.txt内容读入jq,一次性匹配所有目标资源,适合处理大文件或大量资源的场景:
jq --arg resources "$(cat list.txt)" ' ($resources | split("\n") | select(length>0)) as $res_list | .backups[] | select(.resource_name | IN($res_list[])) | {BackupTime: .updated_at, DiskName: .resource_name} ' js.json | head -12 # 按每个资源取4行计算,3个资源对应12行
内容的提问来源于stack exchange,提问作者Harsha Vardhan
相关产品推荐
相关产品推荐

