使用shell导出或者导入es数据库数据

导入数据到es,数据需要是json格式
while IFS= read -r line
do
   curl --user uname:upass -X POST http://ip:9200/索引/类型 -d  “$line” -H 'Content-Type: application/json'
done < "$file"

 

#!/bin/bash

#es
ESHOST="ip:9200"
ESUSER="xx"
ESPASSWD="xx"
MONTH=$1
FIELD_ENV="test1"
FIELD_NSTAT="test2"
BASEDIR="/xxx/test"
ID_PATH="${BASEDIR}/id.txt"
SUM1="${BASEDIR}/1.csv"
SUM2="${BASEDIR}/2.csv"
JQPATH="/usr/local/jq"
CHANSQL1="${BASEDIR}/channel1.sql"
CHANSQL2="${BASEDIR}/channel2.sql"
LOGPATH="${BASEDIR}/error.log"
#NSTAT_VALUES=("0" "3" "4")
#0成功 3失败 4未知 5提交
#DATEDAY=$(date -d "$(date +%Y)-${MONTH}-01 +1 month -1 day" +%d)
#条件是a环境含有test1,b环境不含这个字段
# 筛选a环境所有数据(通过循环各个id),通过状态(nstat字段)进行聚合
use_1(){
     for id in `cat $ID_PATH`
     do
       QUERY_WITH_1='{
    "query": {
    "bool": {
    "must": [     #必须包含test1
      {
        "exists": {
        "field": "'$FIELD_ENV'"
      }
      },
      {
        "term": {
          "channelid": {
            "value": "'$id'"
          }
        }
      }
    ]
  }
},
   "aggs":{
     "nst": {      #自定义字段,后续jq查数据需要
       "terms": {
         "field": "nstat"
       }
     }
   }
}       

}'
    RESULT=$(curl -s -X GET -u ${ESUSER}:${ESPASSWD} ${ESHOST}/test-2023-$2-$1/test/_search?size=0 -H 'Content-Type: application/json' -d "${QUERY_WITH_ENV}" | $JQPATH '.aggregations.nst.buckets[]')  
    if [ $? -eq 0 ];then
        #查出来的数据状态有0,3,4,5,根据不同结果赋值这个状态的数据量给不同的变量,该状态无数据就赋值空
        res0=$(echo $RESULT | $JQPATH --arg key 0 'if .key == ($key|tonumber) then .doc_count else empty end')
        res3=$(echo $RESULT | $JQPATH --arg key 3 'if .key == ($key|tonumber) then .doc_count else empty end')
        res4=$(echo $RESULT | $JQPATH --arg key 4 'if .key == ($key|tonumber) then .doc_count else empty end')
        res5=$(echo $RESULT | $JQPATH --arg key 5 'if .key == ($key|tonumber) then .doc_count else empty end')
        echo "${MONTH}-${index_num},$id,$res0,$res3,$res4,$res5" >> $SUM1
    else
        echo "没有 $2-$1 日索引" >> $LOGPATH
        echo "$RESULT" >> $LOGPATH
    fi
   done
}
#筛选b环境所有数据,通过状态进行聚合
no_1(){
for id in `cat $ID_PATH`
     do
       QUERY_WITHOUT_ENV='{
    "query": {
    "bool": {
    "must_not": [       #必须不包含test1
      {
        "exists": {
        "field": "'$FIELD_ENV'"
      }
      }
    ],
    "must": [
      {
        "match": {
          "channelid": "'$id'"
        }
      }
    ]
  }
 },
  "aggs":{
     "nst": {
       "terms": {
         "field": "nstat"
       }
     }
   }
    }'
    RESULT=$(curl -s -X GET -u ${ESUSER}:${ESPASSWD} ${ESHOST}/test-2023-$2-$1/test/_search?size=0 -H 'Content-Type: application/json' -d "${QUERY_WITHOUT_ENV}" | $JQPATH '.aggregations.nst.buckets[]')
       if [ $? -eq 0 ];then
          res0=$(echo $RESULT | $JQPATH --arg key 0 'if .key == ($key|tonumber) then .doc_count else empty end')
          res3=$(echo $RESULT | $JQPATH --arg key 3 'if .key == ($key|tonumber) then .doc_count else empty end')
          res4=$(echo $RESULT | $JQPATH --arg key 4 'if .key == ($key|tonumber) then .doc_count else empty end')
          res5=$(echo $RESULT | $JQPATH --arg key 5 'if .key == ($key|tonumber) then .doc_count else empty end')
          echo "${MONTH}-${index_num},$id,$res0,$res3,$res4,$res5" >> $SUM2
       else
          echo "没有 $2-$1 日索引" >> $LOGPATH
          echo "$RESULT" >> $LOGPATH
       fi
    done
}
#替换ID为名字
data_re(){
chanid=$(cat $1 | awk '{print $1}')
for i in $chanid
do
      chname=`grep "$i" $1 | awk '{print $2}'`
      sed -i "s/$i/$chname/g" $2
      echo "$2文件ID替换为名成功"
done
}
echo "日期,名称,成功数,失败数,未知数,提交数"  >> $SUM1
echo "日期,名称,成功数,失败数,未知数,提交数"  >> $SUM2
#默认循环31天的索引
for ((index_num =1;index_num <= 31;index_num++))
do 
    if [ $index_num -le 9 ];then
       echo "--------------开始导出a和b: ${MONTH}-${index_num} 日数据---------------" 
       use_1 0$index_num $MONTH
       no_1  0$index_num $MONTH
       echo "--------------done-----------------"
    else
       echo "--------------开始导出a和b: ${MONTH}-${index_num} 日数据---------------" 
       use_1 $index_num $MONTH
       no_1 $index_num $MONTH
       echo "--------------done-----------------"
    fi
done
sleep 2
if [ -f $CHANSQL1-a -f $CHANSQL2 ];then
   data_re $CHANSQL1 $SUM1
   sleep 1
   data_re $CHANSQL2 $SUM2
else
   echo "文件不存在,程序退出" >> $LOGPATH
   exit 1
fi

脚本作用和思路:
作用:es库存储了a环境和b环境的所有数据,a环境数据包含test1字段,b环境数据不包含,其他数据字段一致,需求是想要筛选出来各个环境的数据,并通过上面的几个状态进行汇总
思路:把查询es的命令单独赋值到变量(提前在kibana上检验命令是否正确),之后用curl查出来文档数据,再通过jq命令把聚合的数据按照字段拆分,取出不同状态的数据

 

posted @ 2023-10-30 14:18  菜菜陈  阅读(252)  评论(0)    收藏  举报