1. 程式人生 > >shell指令碼常用處理

shell指令碼常用處理

1.日期引數轉自定義格式(注意執行命令的符號 ` 的區別)

yes=$1
echo $yes
mils=`date -d "$yes -1 day" +%s`    #引數日期減一天轉毫秒
echo $mils
yesterday=`date -d  @$mils +%Y/%m/%d`    #格式化yyyy/mm/dd形式
echo $yesterday

mils=`date -d "$yes -3 hours -1 day" +%s`    # 引數日期減一天和3小時
echo $mils

2.awk字串處理(注意重定向符左端必有空格)

cat a | awk '{print $NF}' > b     # 將a的最後一列擷取重定向到b
sort b > c    # 對b排序重定向到c
sed -e '/items/d' c > d    # 刪除c中含有items字元的所有行
awk '{if(NR%2!=0)ORS="\t";else ORS="\n"}1' d > e    # 每兩行進行合併,並以tab分割

eg:
[a]
Found 2 items
-rwxrwx---   3 hdfs hdfs    1279029 2018-10-22 22:32 /tmp/1.jhist
-rwxrwx---   3 hdfs hdfs     142394 2018-10-22 22:32 /tmp/1.xml
Found 2 items
-rwxrwx---   3 appsearch_dev hdfs   19667953 2018-10-22 00:39 /tmp/2.jhist
-rwxrwx---   3 appsearch_dev hdfs     142346 2018-10-22 00:39 /tmp/2.xml
[e]
/tmp/1.jhist    /tmp/1.xml
/tmp/2.jhist    /tmp/2.xml

awk -F , '{print $(NF-1)}' part > cost    # 以,分割,拿取倒數第二列重定向到檔案cost
awk -F '[:\"]' '{print $(NF-1)}' part >cost    # 以:和"分割,注意轉義,拿取倒數第二列
awk '{sum += $1};END {print sum}' cost         # 對cost第一列做累加並列印結果

3.字串擷取

yes=$1
ymd=`expr substr $1 1 8`    # 取1-8字元,substr下標是從1開始
hh=`expr substr $1 9 2`     # 從小標為9取2個字元
yes="$ymd $hh"              # 拼湊日期,類似20181010 10

4.字串比較之if語句(注意[]號前後後空格)

yes=$1
mils=`date -d "$yes -3 hours -1 day" +%s`
update_hour=`date -d @$mils +%H`
h23="23"
if [ "$h23" = $update_hour  ]; then
    #exec your conmand
fi

5.shell做運算(注意括號的使用規範)

#shell指令碼資料做運算,資料格式為每行2個數,以除法為例。求出第二個數/第一個數,最後再累加
sum=0
cat test.txt | while read line  # while按行讀,for會把一行兩個數拆分成兩行資料
do
   time=`echo $line | awk '{print $1}'`
   mem=`echo $line | awk '{print $2}'`
   res=$(echo "$mem/$time" | bc)  #浮點除法,加bc
   sum=$(($res+$sum))  #算術運算,使用雙括號方式
   echo $sum
done