shell脚本简单命令

目的:从新系统数据库中获取客户信息,读取客户文件中数据,并同步老系统数据库更新。
数据格式:
客户号1^O客户姓名1^O证件类型1^O证件号1^O手机号1
客户号2^O客户姓名2^O证件类型2^O证件号2^O手机号2

demo1.sh

#!/bin/bash

# 此功能是截取数据,并更新到数据库中

# 计时器
startTime=`date '+%Y-%m-%d %H:%M:%S'`
startTime_S=`date +%s`

DB_IP=127.0.0.1
DB_PORT=2828
DB_USR=root
DB_PSW=root
DB_NAME=demo

# 获取参数 sh命令外边带的参数
FILE_NUM=$1 
FILE_NAME=$2
# 计数器
COUNT=0
ERROR_SQL_LOG="error_sql"${FILE_NAME}".1og"
touch $ERROR_SQL_LOG

# 文件位置
FILE_PLACE=/opt/ccaf/batch_process/batch script/test/${FILE_NAME}
# 将binary=进制中的^0分隔符替换成+
si=`echo 15 | awk '{print("%c", $1)}'` && sed 's/'$si'/+/g' $FILE_PLACE

# 循环执行文件每一行
while read -r line
do
	# 客户内部编号
	CUST_INRID=${line%%+*}
	SPLIT_CUST_INRID=$CUST_INRID
	SUB=${CUST_INRID:16:2}
	if [ "${SUB}" = "99" ];then
		CUST_INRID=${CUST_INRID:0:16}
	else
		case "$SUB" in
		"00")
			SUB=A
		;;
		"01")
			SUB=B
		;;
	esac
		CUST_INRID=${SUB}${CUST_INRID:1:15}
	fi
	# 客户姓名
	ARR_LIST=${line#*+}
	CUST_NME=${ARR_LIST%%+*}
	# 证件类型
	ARR_LIST=${ARR_LIST#*+}
	ID_TP=${ARR_LIST%%+*}
	# 证件号
	ARR_LIST=${ARR_LIST#*+}
	ID_TP=${ARR_LIST%%+*}
	# 手机号
	ARR_LIST=${ARR_LIST#*+}
	ID_TP=${ARR_LIST%%+*}
	# insert 语句
	INSERT_SQL="INSERT INTO cust (字段) VALUES (值1),(值2);"
	# update 语句
	UPDATE_SQL="update cust set ....;"
	# >/dev/null 2>&1   不显示错误
	# mysql -h $DB_IP -P $DB_PORT -u $DB_USR -p $DB_PSW -D $DB_NAME -e "${UPDATE_SQL}" >/dev/null 2>&1 if [ -n CUST_INRID ];then
			CUST_DATE=`mysql -h $DB_IP -P $DB_PORT -u $DB_USR -p $DB_PSW -D $DB_NAME -e "select count(1) from cust where csr_idn_ sky ='$CUST_INRID';"`
			CUST_DATE=${CUST_DATE:0-1}
			if [[ $CUST_DATE = "0" ]];then
				# 最后加 & 代表后端执行
				mysql -h $DB_IP -P $DB_PORT -u $DB_USR -p $DB_PSW -D $DB_NAME -e "$INSERT_SQL"
			else
				mysql -h $DB_IP -P $DB_PORT -u $DB_USR -p $DB_PSW -D $DB_NAME -e "${UPDATE_SQL}"
			fi
		fi
	}|| {
		# >> 最后增加; > 重定向,覆盖新增
		echo ${CUST_INRID}"+"${SPLIT_CUST_INRID} >> $ERROR_SQL_LOG
	}

	COUNT=$(( $COUNT + 1 ))
	if [[ $COUNT%2000 -eq 0 ]];then
		# 执行数量打印
		echo "The number of data executed : "$COUNT >> $ERROR_SQL_LOG
	fi
done < $FILE_PLACE


endTime=`date '+%Y-%m-%d %H:%M:%S'`
endTime_S=`date +%s`
sumTime=$[ $endTime_S - $startTime_S ]

echo $[File_NAME]":""$startTime ---> $endTime" "Total:$sumTime seconds"

# 结束生产ok文件
touch ${FILE_NAME}".ok"

splitFile.sh

#!/bin/bash

#此功能是拆分文件
ADE_FILE_NAME=$1

lines=`cat ${ADE_FILE_NAME} | wc -l`

spiltlines=0

echo "lines :" ${lines}

if [ ${lines} -eq 0 ]
then
	echo "The file is empty! "
	echo "[WARN]: ${ADE_FILE_NAME}is empty"
	exit 0
else
	# 拆分5/6个文件
	div=5
	mod=$(expr $lines % $div)
	splitlines=$(expr $lines / $div)
fi

echo "split lines :" $(splitlines}

if [ ${splitlines} -eq 0 ]
then
	echo "The file is not fit for splae!"
	exit o
else
	ADE_FILE_NAME_Split=${ADE_FILE_NAME}.s
	split -l ${splitlines} ${ADE_FILE_NAME} -d -a 3 ${ADE_FILE_NAME_Split}
fi

forsh.sh

#!/bin/bash

# 作为总执行命令,串联起拆分文件和读取文件插入数据库
# 示例:sh forsh.sh 101 demo1.sh tttt.txt
# forsh.sh为当前文件名称
# 101 为拆分的文件数量+1
# demo1.sh为执行sql语句脚本文件名称
# tttt.txt为拆分的数据文件的名称

#拆分的文件数量
NUM=$1
# 执行sql语句脚本文件名称
START_FILE_NME=$2
# 拆分的数据文件的名称
SPLIT_FILE_NME=$3

#拆分脚本
sh SplitFile.sh $SPLIT_FILE_NME

# 循环执行拆分的文件
for ((i=0;i<$NUM;i++))

	do
		if [ ${#i} -eq 1 ];then
			# 增加最后一行
			echo "end" >> $SPLIT_FILE_NME".s""00"$i
			# 去除^M分隔符
			dos2unix $SPLIT_FILE_NME".s""00"$i > /dev/null 2>&1
			sh $$START_FILE_NME"00"$i $SPLIT_FLIE_NME".s""00"$i &
		elif [ ${#i} -eq 2 ];then
			echo "end" >> $SPLIT_FILE_NME".s""0"$i
			dos2unix $SPLIT_FILE_NME".s""0"$i > /dev/null 2>&1
			sh $$START_FILE_NME"0"$i $SPLIT_FLIE_NME".s""0"$i &
		else
			echo "end" >> $SPLIT_FILE_NME".s"$i
			dos2unix $SPLIT_FILE_NME".s"$i > /dev/null 2>&1
			sh $$START_FILE_NME$i $SPLIT_FLIE_NME".s"$i &
		fi
	done
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值