Shell命令整理目录
时间操作 文件编码转换 grep命令排除条件 创建文件 打印日志,和打印日志方法 替换固定字符后输出文件 校验文件是否已存在 整个文件新增第一列 shell脚本读取文件,并发10(大文件按行读取) 字母大小写转换 按固定字符裁剪成数组,循环遍历 判断路径是否存在,若不存在递归遍历创建路径 判断字符串变量是否为空值 判断变量值是否为0 if 的区间判断 hdfs路径下文件数量多少 替换变量中固定字符 压缩文件,并删除源文件 读取配置文件,并且通过固定字符切割后读取 获取文件中的固定列(文件分隔符号为 \t) 循环遍历输出路径下的文件 捕获linux命令是否执行成功 ftp操作样本 读取文件 判断变量是否有值
具体内容如下:
时间操作
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"`
文件编码转换
iconv -f UTF-8 -t GBK test.del -o test.del --将UTF-8 转成 GBK
grep命令排除条件
ll | grep sh | grep -v bak
--查找该目录下含sh字符的文件,并且不包含 bak 字符
创建文件
if [ ! -f "$logfile" ]; then
touch "$logfile"
fi
打印日志,和打印日志方法
function _Mesg(){
echo `date +"%Y%m%d %H:%M:%S"` "---Messages: $1"|tee -a $logfile
}
_Mesg "打印日志"
替换固定字符后输出文件
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
校验文件是否已存在
if [ -f ${resultfile} ]; then
echo `date +"%Y%m%d %H:%M:%S"` "文件校验已存在"
fi
整个文件新增第一列
cat aa.txt | sed -i "s/^/bbb\t/g" aa.txt
--给aa.txt 文件每一行的第一列添加bbb字段,以\t分割,写入aa.txt中
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
字母大小写转换
EXP_JOB=DC_UOFF_UFFF_T_TABLE
JOB_NAME=`tr '[A-Z]' '[a-z]' <<< "${EXP_JOB}"` --转换为小写
a=`tr '[a-z]' '[A-Z]' <<< "${JOB_NAME}"` --转换为大写
按固定字符裁剪成数组,循环遍历
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}'`
判断路径是否存在,若不存在递归遍历创建路径
logfilepath=/home/user/log/job/aa
[ ! -d ${logfilepath} ] && mkdir -p ${logfilepath}
判断字符串变量是否为空值
if [ ! -n "${partition}" ];then --变量移动得用双引号引起来
echo "变量partition 长度为0"
exit 43
fi
判断变量值是否为0
if [ ${file_number} -eq 0 ];then
echo "数值为0"
fi
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
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
替换变量中固定字符
EXP_JOB=DC_UOFF_UM_T_PA
JOB_ID=${EXP_JOB/DC/EX} --将DC替换成EX
压缩文件,并删除源文件
tar -czf file.tar.gz filePath --remove-files
读取配置文件,并且通过固定字符切割后读取
cfg="${PATH}/conf/config.ini"
--HOST=192.19.2.1
HOST=`grep "HOST" $cfg|cut -d'=' -f2` --读取“=”切割的第二个值
HOST=`grep "HOST" $cfg|cut -d'=' -f1`
获取文件中的固定列(文件分隔符号为 \t)
cat ${file} | awk -F'\t' '{print $1,$2,$3,$4}' >a.log
循环遍历输出路径下的文件
for element in `ls $filePath`
do
echo $element
done
捕获linux命令是否执行成功
if [ "$?" = "0" ];then
echo "sucess"
else
echo "failure"
fi
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 ..."
读取文件
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
判断变量是否有值
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