导入数据到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命令把聚合的数据按照字段拆分,取出不同状态的数据