Shell编程日常工作积累,收藏下来,工作效率会大幅提升

Shell命令整理目录

  1. 时间操作
  2. 文件编码转换
  3. grep命令排除条件
  4. 创建文件
  5. 打印日志,和打印日志方法
  6. 替换固定字符后输出文件
  7. 校验文件是否已存在
  8. 整个文件新增第一列
  9. shell脚本读取文件,并发10(大文件按行读取)
  10. 字母大小写转换
  11. 按固定字符裁剪成数组,循环遍历
  12. 判断路径是否存在,若不存在递归遍历创建路径
  13. 判断字符串变量是否为空值
  14. 判断变量值是否为0
  15. if 的区间判断
  16. hdfs路径下文件数量多少
  17. 替换变量中固定字符
  18. 压缩文件,并删除源文件
  19. 读取配置文件,并且通过固定字符切割后读取
  20. 获取文件中的固定列(文件分隔符号为 \t)
  21. 循环遍历输出路径下的文件
  22. 捕获linux命令是否执行成功
  23. ftp操作样本
  24. 读取文件
  25. 判断变量是否有值

具体内容如下:

  1. 时间操作
CURR_TIME=`date +"%Y-%m-%d %H:%M:%S"`  --当前日期格式化
etl_date=`date "-d $etldate" "+%Y-%m-%d"` --传入的参数日期格式化
etl_date=`date "-d -1 day" "+%Y%m%d"`  --获取当前日期的前一天
etl_date2=${date:0:6}   --截取前六位,取月份
one_month_before=`date -d "1 month ago $date " +%Y%m` --获取上个月日期
threeMonth_before=`date "-d -3 month $ETL_DATE"  "+%Y%m%d"`  --获取前三月的日期
oneYear_before=`date "-d -1 year $ETL_DATE"  "+%Y"`      --获取上一年
etl_date_today=`date -d "$etl_date +1 day"  "+%Y%m%d"`   --获取 etl_date的后一天
etl_yesterday=`date -d "$etl_date -1 day" "+%Y%m%d"`     --
etlmonth=`date -d "$etl_date -1 month" "+%Y%m%d"`
etlyear=`date -d "$etl_date -1 year" "+%Y%m%d"`
  1. 文件编码转换
iconv -f UTF-8 -t GBK test.del -o test.del     --将UTF-8 转成 GBK
  1. grep命令排除条件
ll | grep sh | grep -v bak
--查找该目录下含sh字符的文件,并且不包含 bak 字符
  1. 创建文件
if [ ! -f "$logfile" ]; then
    touch "$logfile"
fi
  1. 打印日志,和打印日志方法
function _Mesg(){
    echo `date +"%Y%m%d %H:%M:%S"` "---Messages: $1"|tee -a $logfile
}
_Mesg "打印日志"
  1. 替换固定字符后输出文件
cat ${sqlfile} | sed -e 's/\$etl_date/'$etl_date'/g'  -e 's/\$one_month_before/'$one_month_before'/g'  -e 's/\$two_month_before/'$two_month_before'/g'  > $tmpsql
  1. 校验文件是否已存在
if [ -f ${resultfile} ]; then
  echo `date +"%Y%m%d %H:%M:%S"` "文件校验已存在"  
fi
  1. 整个文件新增第一列
cat aa.txt | sed -i "s/^/bbb\t/g"  aa.txt 
--给aa.txt 文件每一行的第一列添加bbb字段,以\t分割,写入aa.txt中
  1. shell脚本读取文件,并发10(大文件按行读取)
summ=0
while read line
do
     summ=$[summ+1]
     echo `date +"%Y%m%d %H:%M:%S"`"第$summ行"
     paramer=`echo ${line} | awk -F',' '{print $1}'`
     echo $paramer  
     hive -e "$sql" > 201905/$paramer.txt & --后台执行无需等待执行结果反馈

    if [ $(echo "$summ%10" | bc) -eq 0 ];then  
        --判断执行十个任务后等待,等待10个任务全部完成后再遍历下面10行数据
        wait
    fi
done<out_hivesql_v2.txt
  1. 字母大小写转换
EXP_JOB=DC_UOFF_UFFF_T_TABLE
JOB_NAME=`tr '[A-Z]' '[a-z]' <<< "${EXP_JOB}"` --转换为小写
a=`tr '[a-z]' '[A-Z]' <<< "${JOB_NAME}"` --转换为大写
  1. 按固定字符裁剪成数组,循环遍历
EXP_JOB_NAME=DS_ODS_UM_T_TABLE
#得到源表表名
arry=(${EXP_JOB_NAME//_/ }) 
sdataTable=""
for((i=2;i<${#arry[@]};i++));do
    sdataTable=${sdataTable}"_"${arry[$i]}
done
-----------------------------------------
arry=(${primarykey//,/ })   --逗号分隔的裁剪
key_mark=""
for((i=0;i<${#arry[@]};i++));do
    key_mark=${key_mark}"," 
done
-------------------------------------------
b=`echo ${tab} | awk -F"_" '{print $1}'
a=`echo ${tab} | awk -F"_s_" '{print $1}'`
  1. 判断路径是否存在,若不存在递归遍历创建路径
logfilepath=/home/user/log/job/aa
    [ ! -d ${logfilepath} ] && mkdir -p ${logfilepath}
  1. 判断字符串变量是否为空值
if [ ! -n "${partition}" ];then --变量移动得用双引号引起来
   echo "变量partition 长度为0"
   exit 43
fi
  1. 判断变量值是否为0
if [ ${file_number} -eq 0 ];then
    echo "数值为0"
fi
  1. if 的区间判断
if [ ${a} -ge 5 -a ${a} -lt 10 ];then  --大于5 小于10
    THREAD_NUM=5
elif [ ${a} -ge 10 ];then   --大于10
    THREAD_NUM=10
else
    THREAD_NUM=${a}      --小于5
fi
  1. hdfs路径下文件数量多少
hdfs_count=`hadoop fs -ls /warehouse/${Table}/partition |grep -i -v item|wc -l`
if [ ${hdfs_count} -eq 1 ];then
    hdfsPath=`hadoop fs -ls -C /warehouse/${Table}/partition`
    --获取hdfs文件全路径
    file_number=`hadoop fs -cat ${hdfsPath}|wc -l`
    --计算hdfs路径下文件的条数,判断文件内容是否为空
    if [ ${file_number} -eq 0 ];then
        echo "HDFS文件${hdfsPath} 条数为0  "  
    fi
fi
  1. 替换变量中固定字符
EXP_JOB=DC_UOFF_UM_T_PA
JOB_ID=${EXP_JOB/DC/EX} --将DC替换成EX
  1. 压缩文件,并删除源文件
   tar -czf file.tar.gz filePath --remove-files
  1. 读取配置文件,并且通过固定字符切割后读取
cfg="${PATH}/conf/config.ini"
--HOST=192.19.2.1
HOST=`grep "HOST" $cfg|cut -d'=' -f2`  --读取“=”切割的第二个值
HOST=`grep "HOST" $cfg|cut -d'=' -f1`
  1. 获取文件中的固定列(文件分隔符号为 \t)
cat ${file} | awk -F'\t' '{print $1,$2,$3,$4}' >a.log 
  1. 循环遍历输出路径下的文件
for element in `ls $filePath`
do
    echo $element 
done
  1. 捕获linux命令是否执行成功
if [ "$?" = "0" ];then
    echo "sucess"
else
    echo "failure"
fi
  1. ftp操作样本
echo "ftp start...."
ftp -i -n -v <<FTPIT
open 172.16.32.71
user bigdatading bigding,123
bin
prompt
get a b
get x y
close
bye
FTPIT
echo "ftp end ..." 
  1. 读取文件
while read line       --可以按行读取大文件
do
    CONS=$CONS"<br>"${line}
done<aaa2.del
-----------------------------------------
CON=`cat test_${etl_date}.del`      --适合小文件读取到内存,文件过大会占用大量内存
for c in $CON
do
    CONS=$CONS"<br>"$c
done
  1. 判断变量是否有值
if [ -z "$pag" -o -z "$date" -o -z "$name" -o -z "$yushang" -o -z "$qutype" -o -z "$count" -o -z "$iche" ];then
      echo $line  
  else
      echo "$line" >> ${temp}
  fi
发布了10 篇原创文章 · 获赞 11 · 访问量 1481

猜你喜欢

转载自blog.csdn.net/resin_404/article/details/99290513