獲取shell腳本時間戳
A. shell 腳本執行日誌怎麼才能帶有時間戳
封裝一個寫log的shell lib,定義如下函數
#!/bin/sh
function write_log()
{
local logType=$1
local logMsg=$2
local logName=$3
echo "$logType : `date +%Y-%m-%d\ %T` : $logMsg" >> $logName
}
# 按照如下方法調用,可以看到log.txt裡面列印了日期啦
write_log FATAL "something error" log.txt
B. 如何在shell中獲取時間戳
date +%s 顯示當前時間的時間戳
date -d '2017-01-18 11:10' +%s
C. linux下用shell獲取指定文件的最後修改時間並與系統時間比對,如果相差時間超過3分鍾則執行另一個腳本
使用date命令加上合適的時間格式化字元串(+%s),會顯示當前時間(或-d參數指定的時間)與1970-01-01 00:00:00相差的秒數(詳細可以參考date的man手冊)
所以基本想法就是使用date命令分別獲取當前時間與文件修改時間的秒數,然後看這2個秒數之間是否有相差180秒以上。
獲取當前時間比較簡單,直接date +%s就ok了
下面看看如何獲取文件時間
使用stat 命令後面跟一個文件名可以獲取文件的狀態,包括文件修改時間。其中文件修改時間會單獨一行顯示,格式如下:Modify: 2013-02-21 17:58:05.404876407 +0800 (具體的精度可能系統不同略微有些差別,但大致格式是這樣)
所以我們可以stat myfilename | grep Modify來獲取文件的修改時間的信息,然後通過awk分別獲取時間的日期和時間段
stat myfilename | grep Modify | awk '{print $2}' #這句獲取了日期段,即上面例子裡面的2013-02-21
stat myfilename | grep Modify | awk '{split($3,var,".");print var[1]}' #這句獲取了時間段,即上面例子裡面的17:58:05,具體關於awk的使用可以參考awk的使用手冊
那麼現在可以獲取文件修改時間與1970-01-01 00:00:00相差的描述了,就是date -d "$file_date $file_time" +%s
那麼這個時間與當前時間想減的結果與180相比就可以知道是否滿足條件了,滿足條件的話就可以執行相應的命令。
參考代碼如下:
current_datetime=`date +%s`
filedate=`stat tt.txt | grep Modify | awk '{print $2}'`
filetime=`stat tt.txt | grep Modify | awk '{split($3,var,".");print var[1]}'`
file_datetime=`date -d "$filedate $filetime" +%s
timedelta=`expr $current_datetime - $file_datetime`
if [ "$timedelta" -gt "180" ];then
echo "match condition"
fi
D. Shell腳本獲取系統時間 Linux程序
1,$HOME/getdate.sh,內容如下:
#!/bin/bash
DATE=/bin/date
$DATE +"%F %T" >>$HOME/date_log.log
2. $HOME/call_gd.sh,內容如下
#!/bin/bash
SH=/bin/sh
${SH} $HOME/getdate.sh
E. shell腳本獲取時間戳偶爾報錯value too great for base
在linux Shell中並沒有毫秒級的時間單位,只有秒和納秒。所以在shell中可以獲取秒級時間戳,但是不能獲取毫秒級時間戳。
有時候確實需要毫秒級時間戳,於是使用秒和納秒的時間戳來組合一下。通常我們看到的都是如下寫法:
這個方法你快速地反復去執行,大概五六次就會出現一次報錯 value too great for base 。
date '+%N' 獲取納秒時獲取的是一個字元串,而不是數字,且為了保證九位數,前面會補0,例如 073526864 。遇到首字母為0的字元串,shell正常的除法不能自動將其轉換為數字(是的,雖然你看不到有數據類型,但是他是分數字和字元串類型的,並且使用的時候一般都隱含了類型轉換,lua也有這個問題,被坑過無數次)。
使用 expr命令 。
需要注意的是乘法符號 * 需要寫成 \* ,不然無法識別為乘法符號。
F. shell腳本計算時間
TIME_INPUT=`date -d "00:00" +%s`
通過時間戳來計算
nowtime=`date +%s`
shijiancha=`expr $nowtime - $TIME_INPUT`
if [ $shijiancha -gt 180 ];then
echo 3分鍾前
else
if [ $shijiancha -lt -180 ];then
echo 3分鍾後
fi
fi
G. Shell之date命令用法
date命令在shell腳本中用處很大,比如要在腳本中標記一個日誌或者針對某個文件做更改,就可以使用date給它做一些裝飾,比如每天備份mysql,最終生成一個.sql的文件,那麼我們就可以針對這個文件加一個日期的標記,這樣就可以很清晰的知道我們備份的這個文件是哪一天生成的或者周幾生成的,等到下一個對應的周幾,此時備份的sql文件就會自動地將上一個周同一天的備份文件覆蓋掉,這樣就不用刪除文件
1、date
# date //顯示系統當前日期和時間
上面是date命令默認的輸出格式,我們也可以將輸出格式顯示為英文
# LANG=en //將系統環境變數LANG設置為英文格式
# date //然後執行date命令,結果如下
2、年月日
我們標記日期的方式一般的格式是:20180321 、 180321
# date +%Y //year,輸出4位數年
# date +%y //輸出2位數的年
# date +%m //m表示month,輸出的結果是月份
# date +%d //d表示day,日
# date +%D //D表示特殊格式的日期表示方法,如下當前日期為2018年3月21日
我們還可以將上面的年月日組合在一起輸出
# date +%Y%m%d //輸出年月日
# date +%F //輸出的年月日會用連字元隔開
3、時分秒
# date +%H //H表示hour小時
# date +%M //M表示minute分鍾
# date +%S //S表示second秒
# date +%s //輸出結果是一個時間戳,表示距離1970年1月1日0時0分過去多少秒
# date +%T //以下面格式輸出時分秒
# date +%H:%M:%S //效果跟上條命令一樣
4、星期
# date +%w //輸出結果為星期幾,比如下圖表示當前系統時間是星期三
# date +%W //表示當前為今年的第幾周,比如我這里為今年的第12周
5、日歷
# cal //展示日歷
6、從當前時間往前或往後推算
使用場景:比如我們切割日誌在今天的0時0分,那麼被切割出去的日誌應該以昨天的日期來標記,因此需要倒推一天
# date -d "-1day" //當前系統時間為3月21日,輸出結果為3月20日
# date -d "-1day" +%F
# date -d "-1 month" +%F //上個月
# date -d "-1 year" +%F //表示去年,year後面也可以加上s,day和month後也可以加上s
其他的時分秒也諸如此類
7、時間戳
# date +%s //獲取時間戳
# date -d @1521563928 //將時間戳換算成日期
# date +%s -d "2017-03-21 00:38:48" //將日期換算成時間戳
H. shell腳本中時間戳問題
獲取時間戳:date +%s
精確到毫秒:echo $[$(date +%s%N)/1000000]
from:網頁鏈接
I. 在shell中怎麼獲取當前日期和時間
獲得當天的日期:[root@master~]#date+%Y-%m-%d
有時候需要使用今天之前或者往後的日期,這時可以使用date的 -d參數。
獲取明天的日期:date-dnext-day+%Y%m%d
獲取昨天的日期:date-dlast-day+%Y%m%d
獲取上個月的年和月:date-dlast-month+%Y%m
獲取下個月的年和月:date -d next-month +%Y%m
獲取明年的年份:date -d next-year +%Y

(9)獲取shell腳本時間戳擴展閱讀
時間域參數:
時間域參數用於格式化輸出日期,相關時間域參數如下:
% H 小時(00…23)
% I 小時(01…12)
% k 小時(0…23)
% l 小時(1…12)
% M 分(00…59)
% p 顯示出AM或PM
% r 時間(hh:mm:ss AM或PM),12小時
% s 從1970年1月1日00:00:00到目前經歷的秒數
% S 秒(00…59)
