如何将CSV中的请求ID逐行传入Linux脚本执行Elasticsearch查询
解决方案
你的脚本存在几个关键问题,下面是修正后的方案:
原脚本问题点
- 数组赋值错误:读取文件内容时未使用正确的命令替换语法
- 循环遍历错误:直接遍历数组名而非数组元素
- 变量解析失败:单引号包裹的JSON中
$i不会被Shell解析 - 结果覆盖:使用
>会每次清空文件,只保留最后一次查询结果
方法1:数组遍历(适用于无特殊字符的请求ID)
# 将CSV文件内容读取到数组(假设每行一个ID) request_ids=($(cat file.csv)) # 遍历数组中的每个请求ID for req_id in "${request_ids[@]}"; do # 用双引号包裹JSON,确保变量被正确解析 curl -XGET "127.0.0.1:9200/_search?pretty" -d "{ \"query\": { \"match\": { \"request_id\": \"$req_id\" } } }" >> answer.csv done
方法2:while read循环(更可靠,支持特殊字符/空白行)
如果你的CSV文件包含空白行或ID有特殊字符,推荐用这种方式:
# 逐行读取文件,跳过空行 while IFS= read -r req_id; do [[ -z "$req_id" ]] && continue curl -XGET "127.0.0.1:9200/_search?pretty" -d "{ \"query\": { \"match\": { \"request_id\": \"$req_id\" } } }" >> answer.csv done < file.csv
高效优化:批量查询(推荐)
2500次单独请求效率极低,建议用Elasticsearch的terms查询一次性批量查询所有ID:
# 将所有ID拼接成JSON数组格式 ids=$(paste -sd ',' file.csv | sed 's/^/["/;s/,/","/g;s/$/"]/') # 执行一次批量查询 curl -XGET "127.0.0.1:9200/_search?pretty" -d "{ \"query\": { \"terms\": { \"request_id\": $ids } } }" >> answer.csv
内容的提问来源于stack exchange,提问作者Amirhossein eidy
相关产品推荐
相关产品推荐

