文章目录
方便以后翻查,持续更新…
更新日期:2021-09-01
1、 日期循环执行脚本框架
1.1、 架构,三大部件
- 判断输入参数格式,传递日期
- 循环传入的日期周期
- 执行方法体
架构框架代码
syn_table_data.sh
#!/bin/bash
#以下3个部件,第一部件,判断输入参数格式,传递日期,第二部件,循环传入的日期周期。第三部件:执行方法体
#传入的时间格式:年月日 %Y%m%d 如:20200101 20200201
#完整的执行脚本两种。有参,循环区间包含输入输入参数的那天
#第一种有参:bash /data/script/excute.sh 20200101 20200201
#第二种无参:bash /data/script/excute.sh
current_time=`date +"%Y-%m-%d %H:%M:%S"`
param_one=$1
param_two=$2
log_path=/data/log/daily_script/`echo ${current_time:0:10} |sed s/-//g `
mkdir -p ${log_path}
#3.执行方法体,也可以变为调用外部脚本
function excute_method(){
echo "back_sql excute_date=${excute_date}"
/data/script/syn_table_data_children.sh ${excute_date}
}
#2.日期循环
function foreach_method(){
echo "foreach_method param_method=${param_method} start_date=${start_date} end_date=${end_date}"
while [ ${start_date} -le ${end_date} ]
do
excute_date=`date -d "${start_date}" +%Y-%m-%d`
excute_method
start_date=`date -d "-1 days ago ${start_date}" +%Y%m%d`
done
}
#1.校验参数
if [ -z "${param_one}" ]
then
yesterday_time=`date -d "-1 days" +%Y%m%d`
#start_date=`echo ${current_time:0:10} |sed s/-//g `
#end_date=`echo ${current_time:0:10} |sed s/-//g`
start_date=${yesterday_time}
end_date=${yesterday_time}
param_method=dailyExcute
foreach_method
else
start_date=${param_one}
end_date=${param_two}
echo "=========${start_date} ${end_date} current=`date +%Y%m%d%H%M`============"
if [[ ${start_date} > ${end_date} ]]
then
echo "the first param must less than second param. "
exit 0
else
current_date=`date +%Y%m%d%H%M`
if [[ ${end_date} > ${current_date} ]]
then
echo "the second param must less today. second_param:${end_date} today:${current_date} "
exit 0
else
param_method=historyExcute
foreach_method
fi
fi
fi
执行方法,还有注意信息
- 传入的时间格式:年月日 %Y%m%d 如:20200101 20200201
- 完整的执行脚本两种。有参,循环区间包含输入输入参数的那天
- 第一种有参:bash /data/script/excute.sh 20200101 20200201
- 第二种无参:bash /data/script/excute.sh
syn_table_data_children.sh
#!/bin/bash
param_one=$1
mkdir -p /data/sql/big_data/general_pay/
mysqldump -uroot -padmin -t test user --where="name='tcl' and date='2020-02-02'" --triggers=false > /data/sql/big_data/general_pay/2020-02-02.sql
1.2、 获取时间
date=`date +"%Y-m-d %H:%M:%S"`
1.3、 格式化/赋值对象时间
-
命令
- 添加“-d”参数
-
实例
date=20200202 turn_date=`date -d ${date} +"%Y-%m-%d"` echo "date=${date} turn_date=${turn_date} " #在命令台的测试命令,用分号隔开就好, #date=20200202;turn_date=`date -d ${date} +"%Y-%m-%d"`;echo "date=${date} turn_date=${turn_date} "
2、 读取文件方法
2.1、while方法
-
语法
while read line do echo "${line}" done < ${file_path}
-
实例
#!/bin/bash param_one=$1 mkdir -p /data/sql/big_data/general_pay/ file_path=/data/script/read_data/ file_name=data_table.csv #read file while read line do #echo "==$line" #save base value OLD_IFS="$IFS" #change value IFS="," arr=($line) #Restore value IFS="$OLD_IFS" echo "这里可以使使用数组循环得到,one=${arr[0]} two=${arr[1]} three=${arr[2]} four=${arr[3]}" done < ${file_path}${file_name}
3、 数组
3.1、 创建数组
array=(1 2 3)
3.2、 数组遍历
-
标准模式
-
语法
for(( i=0;i<${#array[@]};i++)) do #${#array[@]}获取数组长度用于循环 echo ${array[i]}; done;
-
示例
read_database_name_array=(big_data data) #read file for (( i=0; i<${#read_database_name_array[@]}; i++ )) do echo ${read_database_name_array[i]} done exit 0
-
4、 字符串
4.1、 字符串替换
4.1.1 sed方法
-
语法
- sed s/source/new/g
- g表示替换全部。
-
实例
- 替换字符串
str="1234455" str=`echo ${str}|sed s/4/9/g`
-
替换文件,加i
- 替换里面的文件内容4,改为10。
sed -i 's/4/10/g' test.txt
4.1.x 特殊字符串
- 比如^M
- 人工输入的话不能直接按和M,要按三个快捷键Control+v+m才可以。要输入A也是一样的操作:Ctrl+v+A
- 去除命令:
- status=
echo ${arr[3]}| sed 's/^M//g'
- status=
echo ${arr[3]}| tr -d '^M'
- status=
4.2字符串分割
4.2.1、 IFS
-
实例
while read line do #echo "==$line" #保存IFS原始值 OLD_IFS="$IFS" #改变IFS值,此值是文件的分隔符,csv用的是英文逗号(,) IFS="," #切割字符串 arr=($line) #还原IFS值 IFS="$OLD_IFS" echo "one=${arr[0]} two=${arr[1]} three=${arr[2]} four=${arr[3]}" done < ${file_path}${file_name}
4.2.2 使用字符串里面的变量分割
-
实例
获取年月日
excute_date="2020-01-04 10:13:32" excute_date_str=(${excute_date// / }) excute_date=${excute_date_str[0]} echo "date=${excute_date}" #---逗号分割-- excute_date="1,2,3,5" excute_date_str=(${excute_date//,/ }) excute_date=${excute_date_str[0]} echo "date=${excute_date}"
4.3、 字符串长度
str="abc"
str_length=${#str}
5、 算法
5.1、 加法
a=0
a=`expr $a + 1`
6、解压缩
6.1、 tar命令
-
解压
-
语法
-
实例
tar -zcvf tar_name.tar.gz target_folder
-
-
压缩
-
语法
- -c folder_path 解压到指定目录用:-C
-
实例
tar -zxvf tar_name.tar.gz -C folder
-
7、 VIM
7.1、 替换某个字符串
-
语法
- g 表示全局替换,没有g的话表示只替换发现的首个。
-
实例
把文件里面的所有foo替换成bar
:%s/foo/bar/g
7.2、 查找某个字符串
-
按键盘最右边上面的Esc键
-
按键盘/输入你要查找的字符串
-
按回车键
-
查找下一个按键盘小写n键
-
查找上一个按键盘大写N键
- 查找实例
7.3、 显示行数
-
语法
se nu
8、 传输
8.1、 scp
-
在A服务器把在A服务器的文件(file)从A传到B服务器
-
语法
- 传输文件:scp file target_user@target_ip:target_floder
- 传输目录包含子目录和文件:scp -r floder target_user@target_ip:target_floder
-
实例
scp A.file root@192.*.*.*:/data/
-
-
在A服务器把在B服务器的文件从B传到A服务器
-
语法
-
实例
scp root@192.*.*.*:/data/B.file /home/
-
9、 打印目录下的文件夹或者文件
9.1、 for循环
-
实例
function read_file(){ read_file_path=/data/sql/ cd ${read_file_path} for table in `ls` do echo "read_file_path=${read_file_path} tabel_name=${table} " done }
10、mysql
10.1、 执行mysql语句
mysql_server=192.168.3.123
mysql_port=3378
mysql_account=root
mysql_password=admin
log_path=/data/log/sql/
log_file=`date +"%Y-%m-%d"`.log
##EOF之间就类似mysql登录后的命令台。
function sql_excute(){
echo "sql_excute_start_time=`date +"%Y-%m-%d %H:%M:%S"` ">> ${log_path}${log_file}
mysql -h${mysql_server} -P${mysql_port} -u${mysql_account} -p${mysql_password} <<EOF
use ${database};
select * from ${table} limit 3;
EOF
echo "sql_excute_end_time=`date +"%Y-%m-%d %H:%M:%S"` ">> ${log_path}${log_file}
}
10.2、 导出mysql数据
10.2.1 根据条件导出mysql文件。mysqldump
-
使用mysqldump根据条件导出数据
-
语法
mysqldum -u${account} -p${password} -t ${database} ${table} --where="1=1" --triggers=false >${export_file}
-
实例
mysqldump -uroot -padmin -t test user --where="name='tcl' and date='2020-02-02'" --triggers=false > /data/sql/test/user/20200202.sql
-
11、 语句
11.1、 case
- 实例:调用一个脚本,传递一个参数,执行符合参数里面的程序。比如我要编写个脚本控制远程服务器的某个服务启动,或者关闭。
#!/bin/bash
case $1 in
"start"){
for i in a b c
do
echo "$i"
done
};;
"stop"){
for i in 1 2 3
do
echo "$i"
done
};;
esac
- 注意点:
- 每个case一定要分号(;;)结尾,前面的分号表示大括号())结尾,后面的是响应括号(})结尾。
- case后面结尾一定要加esac。要不会提示:syntax error: unexpected end of file
12 xargs
12.1 执行打包目录下所有文件,用当前文件夹或者文件命名
##脚本内容file_tar.sh
cd /data/product
ls |xargs -i tar -zcvf {}.tar.gz {}
##执行
sh file_tar.sh
12.2 解压当前目录下所有压缩包
ls /data/tar/20210101/*.tar.gz | xargs -n1 tar xzvf
12.3 删除含有某个关键字的进程
ps ax|grep wireless|awk '{print $1}'|xargs kill