Unix yyyymmddhhmmss格式转换为特定日期格式

时间:2019-02-13 17:34:15

标签: date unix

正在运行一个bash脚本,该脚本输出带有时间logs_debug_20190213043348的文件夹名称。我需要能够将日期提取为可读格式yyyy.mm.dd.hh.mm.ss,并且还可以将其转换为GMT时区。我正在使用以下方法提取。

回显“ $ {文件夹## * _}” | awk'{print substr($ 0,1,4)“。” substr($ 0,5,2)“。” substr($ 0,7,2)“。” substr($ 0,9,6)}'

有没有一种更好的方式来打印输出而无需编写复杂的shell脚本?

2 个答案:

答案 0 :(得分:0)

这是满足您需求的管道。看起来当然并不简单,但是采用每个组件都可以理解:

echo "20190213043348" | \
sed -e 's/\([[:digit:]]\{4\}\)\([[:digit:]]\{2\}\)\([[:digit:]]\{2\}\)\([[:digit:]]\{2\}\)\([[:digit:]]\{2\}\)\([[:digit:]]\{2\}\)/\1-\2-\3 \4:\5:\6/' | \
xargs -d '\n' date -d | \
xargs -d '\n' date -u -d

第一行只是打印日期字符串,以便sed格式化它(以便可以轻松修改它以适应您传递字符串的方式)。

带有sed的第二行将字符串从您提供的格式转换为类似的格式,可以由date进行解析:2019-02-13 04:33:48

然后,我们使用date将日期传递到xargs,并使用运行脚本的设备的时区(在我的情况下为CST)将其格式化:Wed Feb 13 04:33:48 CST 2019

最后一行将由date的第一次调用给出的日期字符串转换为UTC时间,而不是停留在本地时间:Wed Feb 13 10:33:48 UTC 2019

如果希望使用其他格式,则可以使用date参数修改+FORMAT的最终调用。

答案 1 :(得分:0)

内部字符串转换功能太有限,因此我们在需要时使用sedtr

## The "readable" format yyyy.mm.dd.hh.mm.ss isn’t understood by date. 
## yyyy-mm-dd hh:mm:ss is. So we first produce the latter.

# Note how to extract the last 14 characters of ${folder} and that, since
# we know (or should have checked somewhere else) that they are all digits,
# we match them with a simple dot instead of the more precise but less
# readable [0-9] or [[:digit:]]
# -E selects regexp dialect where grouping is done with simple () with no
# backslashes.
d="$(sed -Ee's/(....)(..)(..)(..)(..)(..)/\1-\2-\3 \4:\5:\6/'<<<"${folder:(-14)}")"

# Print the UTF date (for Linux and other systems with GNU date)
date -u -d "$d"

# Convert to your preferred "readable" format  
# echo "${d//[: -]/.}" would have the same effect, avoiding tr
tr ': -' '.'<<<"$d"

对于具有BSD date(尤其是MacOS)的系统,请使用

date -juf'%Y-%m-%d %H:%M:%S' "$d"

代替上面给出的date命令。当然,在这种情况下,最简单的方法是:

# Convert to readable
d="$(sed -Ee's/(....)(..)(..)(..)(..)(..)/\1.\2.\3.\4.\5.\6/'<<<"${folder:(-14)}")"
# Convert to UTF
date -juf'%Y.%m.%d.%H.%M.%S' "$d"