我试图在shell脚本中创建一个时间戳变量,以使日志记录更容易一些。我想在脚本的开头创建变量,并让它在发出echo $timestamp时打印出当前时间。事实证明这比我想象的要困难得多。以下是我尝试过的一些方法:
timestamp="(date +"%T")"回显输出(date +"%T")
timestamp="$(date +"%T")"回显变量初始化的时间。
我尝试过的其他方法都只是细微的变化,效果并不好。有人知道我要怎么做吗?
我试图在shell脚本中创建一个时间戳变量,以使日志记录更容易一些。我想在脚本的开头创建变量,并让它在发出echo $timestamp时打印出当前时间。事实证明这比我想象的要困难得多。以下是我尝试过的一些方法:
timestamp="(date +"%T")"回显输出(date +"%T")
timestamp="$(date +"%T")"回显变量初始化的时间。
我尝试过的其他方法都只是细微的变化,效果并不好。有人知道我要怎么做吗?
当前回答
您可以参考下表生成各种格式的时间戳:
Format / result | Command | Output |
---|---|---|
YYYY-MM-DD | date -I |
$(date -I) |
YYYY-MM-DD_hh:mm:ss | date +%F_%T |
$(date +%F_%T) |
YYYYMMDD_hhmmss | date +%Y%m%d_%H%M%S |
$(date +%Y%m%d_%H%M%S) |
YYYYMMDD_hhmmss (UTC version) | date --utc +%Y%m%d_%H%M%SZ |
$(date --utc +%Y%m%d_%H%M%SZ) |
YYYYMMDD_hhmmss (with local TZ) | date +%Y%m%d_%H%M%S%Z |
$(date +%Y%m%d_%H%M%S%Z) |
YYYYMMSShhmmss | date +%Y%m%d%H%M%S |
$(date +%Y%m%d%H%M%S) |
YYYYMMSShhmmssnnnnnnnnn | date +%Y%m%d%H%M%S%N |
$(date +%Y%m%d%H%M%S%N) |
YYMMDD_hhmmss | date +%y%m%d_%H%M%S |
$(date +%y%m%d_%H%M%S) |
Seconds since UNIX epoch | date +%s |
$(date +%s) |
Nanoseconds only | date +%N |
$(date +%N) |
Nanoseconds since UNIX epoch | date +%s%N |
$(date +%s%N) |
ISO8601 UTC timestamp | date --utc +%FT%TZ |
$(date --utc +%FT%TZ) |
ISO8601 UTC timestamp + ms | date --utc +%FT%T.%3NZ |
$(date --utc +%FT%T.%3NZ) |
ISO8601 Local TZ timestamp | date +%FT%T%Z |
$(date +%FT%T%Z) |
YYYY-MM-DD (Short day) | date +%F\(%a\) |
$(date +%F\(%a\)) |
YYYY-MM-DD (Long day) | date +%F\(%A\) |
$(date +%F\(%A\)) |
其他回答
对于我的欧洲同胞,试试这个:
timestamp=$(date +%d-%m-%Y_%H-%M-%S)
将给出格式格式:“15-02-2020_19-21-58”
你调用这个变量并得到像这样的字符串表示
$timestamp
GNU bash的时间戳格式化技巧,版本4.4.20(1)-release (x86_64-pc-linux-gnu)
echo "$(date +%Y-%m-%d_%H:%M:%S.%6N) Info >>> enter main"
输出:
2023-01-08_23:08:48.013592 Info >>> enter main
如果你想用空格替换'_',请执行以下操作(w/o '\'得到错误消息)
echo "$(date +%Y-%m-%d\ %H:%M:%S.%6N) Info >>> enter main"
echo "$(date +%Y-%m-%d\ %T.%6N) Info >>> enter main"
输出:
2023-01-08 23:10:40.692674 Info >>> enter main
避免叉! !
必须为每一行日志运行日期是多余的!!
尽可能使用bash的内置。
更新2023
在提出这个问题时,bash版本是bash-4.2。
在这个版本中,纯bash打印当前时间的方式是:
printf '%(%T)T\n' -1
or
printf '%(%T)T\n' -1
所以一个简短的函数登录每一行的时间戳可以是:
logLine() {
printf '%(%T)T %s\n' -1 "$*"
}
Then
$ logLine Hello world.
10:11:32 Hello world.
今天,我使用bash-5.1.4…
从bash版本5.0-alpha开始,(2018-05-22):
b.变量EPOCHSECONDS扩展为以秒为单位的时间 从Unix时代开始。 c.有一个EPOCHREALTIME变量,扩展为以秒为单位的时间 从Unix时代开始的微秒粒度。
所以如果你想使用微秒粒度,函数可以变成:
logLine() {
local now=$EPOCHREALTIME
printf '%(%T)T.%s %s\n' ${now%.*} ${now#*.} "$*"
}
Then
$ logLine Hello world.
10:15:56.862732 Hello world.
重要提示:不要混淆EPOCHREALTIME和EPOCHSECONDS!!
ISO 8601格式(2018-12-23T12:34:56)比UNIX时间戳更具可读性。然而,在某些操作系统上,你不能在文件名中有:。因此,我建议使用这样的方法:
2018-12-23_12-34-56
您可以使用以下命令来获取该格式的时间戳:
TIMESTAMP=`date +%Y-%m-%d_%H-%M-%S`
这是我看到许多应用程序使用的格式。另一个好处是,如果你的文件名以这个开头,你可以按字母顺序排序它们会按日期排序。
您可以参考下表生成各种格式的时间戳:
Format / result | Command | Output |
---|---|---|
YYYY-MM-DD | date -I |
$(date -I) |
YYYY-MM-DD_hh:mm:ss | date +%F_%T |
$(date +%F_%T) |
YYYYMMDD_hhmmss | date +%Y%m%d_%H%M%S |
$(date +%Y%m%d_%H%M%S) |
YYYYMMDD_hhmmss (UTC version) | date --utc +%Y%m%d_%H%M%SZ |
$(date --utc +%Y%m%d_%H%M%SZ) |
YYYYMMDD_hhmmss (with local TZ) | date +%Y%m%d_%H%M%S%Z |
$(date +%Y%m%d_%H%M%S%Z) |
YYYYMMSShhmmss | date +%Y%m%d%H%M%S |
$(date +%Y%m%d%H%M%S) |
YYYYMMSShhmmssnnnnnnnnn | date +%Y%m%d%H%M%S%N |
$(date +%Y%m%d%H%M%S%N) |
YYMMDD_hhmmss | date +%y%m%d_%H%M%S |
$(date +%y%m%d_%H%M%S) |
Seconds since UNIX epoch | date +%s |
$(date +%s) |
Nanoseconds only | date +%N |
$(date +%N) |
Nanoseconds since UNIX epoch | date +%s%N |
$(date +%s%N) |
ISO8601 UTC timestamp | date --utc +%FT%TZ |
$(date --utc +%FT%TZ) |
ISO8601 UTC timestamp + ms | date --utc +%FT%T.%3NZ |
$(date --utc +%FT%T.%3NZ) |
ISO8601 Local TZ timestamp | date +%FT%T%Z |
$(date +%FT%T%Z) |
YYYY-MM-DD (Short day) | date +%F\(%a\) |
$(date +%F\(%a\)) |
YYYY-MM-DD (Long day) | date +%F\(%A\) |
$(date +%F\(%A\)) |