shell

1.双重循环
#!/bin/bash
cd /data/pyspark/program/auto_report/zhengyuan/test
begin_date="2019-01-01"
end_date="2019-02-25"
while [ $begin_date != $end_date ]
do
cat dw.dwd_pcrowd_order_di.init.conf | while read line
    do
    stat_type=`echo ${line} | awk -F" " '{print $1}'`
    echo ${stat_type}
    ptype=`echo ${line} | awk -F" " '{print $2}'`
    echo ${ptype}
    stat_value=`echo ${line} | awk -F" " '{print $3}'`
    echo ${stat_value}
    bdate=`echo ${line} | awk -F" " '{print $4}'`
    echo ${bdate}
    ds=$1
    echo ${ds}
    edate=`date -d "1 days ${ds}" +"%Y-%m-%d"`
    echo ${edate}
    /data/pyspark/program/auto_report/tool/cc_hive -f dwd_online_pcrowd_num_di_his.hql -p "stat_type=${stat_type},ptype=${ptype},stat_value=${stat_value},bdate=${bdate},edate=${edate},ds=${begin_date}"
    done
begin_date=`date -d "1 day $begin_date" +%Y-%m-%d`
done
2.循环脚本
#!/bin/bash
begin_date="2018-10-01"
end_date="2019-02-01"
while [ $begin_date != $end_date ]
do
begin_date=`date -d "1 month $begin_date" +%Y-%m-%d`
echo $begin_date
done
3.循环脚本
  • 代码内容
#!/bin/bash
cd /data/pyspark/program/auto_report/zhengyuan/test
cat dw.dwd_pcrowd_order_di.init.conf | while read line
do
    stat_type=`echo ${line} | awk -F" " '{print $1}'`
    echo ${stat_type}
    ptype=`echo ${line} | awk -F" " '{print $2}'`
    echo ${ptype}
    stat_value=`echo ${line} | awk -F" " '{print $3}'`
    echo ${stat_value}
    bdate=`echo ${line} | awk -F" " '{print $4}'`
    echo ${bdate}
    ds=$1
    echo ${ds}
    edate=`date -d "1 days ${ds}" +"%Y-%m-%d"`
    echo ${edate}
    /data/pyspark/program/auto_report/tool/cc_hive -f dwd_pcrowd_order_di_his.hql -p "stat_type=${stat_type},ptype=${ptype},stat_value=${stat_value},bdate=${bdate},edate=${edate},ds=${ds}"
done
  • 文件内容
all d   "all"   2018-10-01
all w   "all"   2018-10-01
all m   "all"   2018-10-01
l1cat d   l1_id   2018-10-01
l1cat w   l1_id   2018-10-01
l1cat m   l1_id   2018-10-01
4.Linux shell中2>&1的含义解释 (全网最全,看完就懂)
3.删除 /data1/airflow/logs 文件下的文件
#!/bin/bash
find /data1/airflow/logs  -mtime +30 -name "*.log"|xargs rm -rf
find /data1/airflow/logs  -mtime +30 -name "201[0-9]*T*"|xargs rm -rf

find 
-mtime +30    #30天之前修改过的文件
-name "*.log"    #正则匹配文件名包含 .log 的文件
|xargs rm -rf    #文件名传入后,一批一批的删除
4.shell中&&和||的使用方法

1.只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。
2.如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令(命令2);或者换句话说,“如果这个命令执行失败了||那么就执行这个命令。

4.wc的使用
wc 有四个参数可选,分别是l,c,m,w
wc -l filename    #报告行数
wc -c filename    #报告字节数
wc -m filename    #报告字符数
wc -w filename    #报告单词数
ps -ef|grep airflow|grep scheduler|wc -l    #结合 grep 使用
5.awk学习
kill $(ps -ef | grep "airflow scheduler" | awk '{print $2}')   #手动杀死包含“airflow scheduler”的进程

-F指定分隔符
awk -F":" '{print $1 $3}'  /etc/passwd                       //$1与$3相连输出,不分隔
awk -F":" '{print $1,$3}'  /etc/passwd                       //多了一个逗号,$1与$3使用空格分隔
awk -F":" '{print $1 " " $3}'  /etc/passwd                  //$1与$3之间手动添加空格分隔
awk -F":" '{print "Username:" $1 "\t\t Uid:" $3 }' /etc/passwd       //自定义输出  
awk -F: '{print NF}' /etc/passwd                                //显示每行有多少字段
awk -F: '{print $NF}' /etc/passwd                              //将每行第NF个字段的值打印出来
6.awk 进阶
  • 非常棒,awk基础
begin_date=`date -d "-100 day" +%Y-%m-%d`       #外部参数
hdfs dfs -ls /user/spark/applicationHistory |awk '$6<"'"$begin_date"'" {print "hdfs dfs -rm "$8}'|/bin/bash     #筛选根据空格分隔的 第六列 小于 begin_date 的值,然后把后面的打印出来,传入第八列的值,最后把打印出来的语句使用bash执行
6.外部传入参数执行hive语句
  • 双引号里面的语句是可以传入参数的
  • 传入参数之后还可以进行拼接 {table}_di
mdb='kaipao'
hdb='zhengyuan'
table='water_friend_rel'
check_col='create_time'
ds='2019-04-22'
hive -e "show columns from ${hdb}.${table}_di" |grep -v 'WARN:' > tmp1.txt
7.IF使用——shell判断空值
tf=`cat ${mdb}.${table}.timestamp`
if [ -n "${tf}" ]; then
    echo "时间戳长度文件存在"
    l=${#tf}
else
    echo "时间戳长度文件不存在,需创建"
    mysql -u datateam -pRJ4f84S4RjfRxRMm -h172.16.8.4 -A ${mdb}  -e "select max(${check_col}) from ${mdb}.${table} where ${check_col} >unix_timestamp(date_sub('${ds}', interval 30 day))" |awk 'NR>1' >${mdb}.${table}.timestamp
    tf=`cat ${mdb}.${table}.timestamp`
    l=${#m1}
fi
8.IF使用——多条件判断和等号
if [[ ! -n "$a" && l -eq 13 ]]; then
  echo "全量导入"
  #录入全量导入的代码
elif [[ -n "$a" && l -eq 13 ]]; then
  echo "增量导入,有表结构,历史有数据,本分区有数据"
elif [[ ! -n "$a" && l -eq 10 ]]; then
  echo "全量导入"
elif [[ -n "$a" && l -eq 10 ]]; then
  echo "增量导入,有表结构,历史有数据,本分区有数据"
else
  echo "其他异常"
fi
9.ncftpget 从服务器下载
#登录服务器(默认进入服务器的 /date/ftp 文件夹)
/usr/local/Cellar/ncftp/3.2.6/bin/ncftpget -u devops -p idongjia@123 172.16.7.103

#下载数据 (cd zy) 进入自己的文件夹
get 文件名
默认下载到  /usr/local/Cellar/ncftp/3.2.6/bin/ 也就是 ncftpget 命令默认的文件夹
10.批量修改文件名的后缀
ls |  awk -F ' - 技术-数据算法组 - 东家百科' '{print  "mv \""   $0  "\"  "  $1$2  "  " }' | /bin/bash

你可能感兴趣的:(shell)