正在运行一个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脚本?
答案 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)
内部字符串转换功能太有限,因此我们在需要时使用sed
和tr
。
## 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"