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 篇原創文章 · 獲贊 12 · 訪問量 1900
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章