【问题标题】:changing the date format in shell script更改 shell 脚本中的日期格式
【发布时间】:2013-02-23 07:19:29
【问题描述】:

我有一个字符串,我需要将国家名称和日期分开。

# echo 'india16-Feb-2013-20-33.sql' |  sed 's/[0-9][0-9]//' | awk -F"-" '{print $1}'
india

# echo 'india16-Feb-2013-20-33.sql' |  sed 's/india//' | awk -F"." '{print $1}'
16-Feb-2013-20-33

1) 上面的 sed + awk 是否正确?有没有更好的办法?

2) 如何将日期格式化为2013-02-16 20:33:00

我使用以下命令得到了上面提到的字符串(16-2 月)。但是不知道怎么改回来。

date '+%d-%b-%Y-%H-%M'

【问题讨论】:

  • 您使用的是现代 linux 系统,还是旧线 Unixen(Sun、HP、AIX 等)?请注意,标签日期只有 89 个关注者,因此请考虑将该标签换成 OS 标签。在新的基于 GNU 的 linux 中,这可以在 1 个 awk cmd 中完成(调用 gnudate 进行转换)。祝你好运。

标签: shell date python-2.7 sed awk


【解决方案1】:

我无法获得 seddate 版本在 osx 上工作,所以我做了一个 Python 版本。

import datetime
import re
datestr = 'india16-Feb-2013-20-33.sql'

(country, date) = re.findall('(.*?)(\d{2}-.{3}-\d{4}-\d{2}-\d{2}).*', datestr)[0]

dt = datetime.datetime.strptime(date, "%d-%b-%Y-%H-%M")

print "country=", country
print "dt=", dt

给予:

country= india
dt= 2013-02-16 20:33:00

【讨论】:

  • tinyurl.com/c6crrdq # 你能检查一下使用的 if else 逻辑是否正确,或者是否有更好的方法来做同样的事情?
【解决方案2】:

我开始爱上sed

$ cat a.txt
india16-Feb-2013-20-33.sql

$ sed 's/[0-9].*//' a.txt
india

$ sed 's/[a-z]*//; s/-/ /3; s/-/:/3; s/.sql//' a.txt | xargs -0 date '+%F %T' -d
2013-02-16 20:33:00

【讨论】:

  • 在少数情况下,国家名称以数字结尾。例如india2 在这种情况下,日期应选择为 2 位数字 + "-"
【解决方案3】:

使用sed 和一个替换:

sed 's/.*\([0-9]\{2\}-[A-Z][a-z]\{2\}-[0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\).*/date -d "\1 \2\3" +"%F %T"/ge'

就我个人而言,我发现使用GNU sed 会更容易一些:

sed -r 's/.*([0-9]{2}-[A-Z][a-z]{2}-[0-9]{4})-([0-9]{2})-([0-9]{2}).*/date -d "\1 \2\3" +"%F %T"/ge'

结果:

2013-02-16 20:33:00

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-26
    • 2023-03-14
    • 2011-11-22
    • 1970-01-01
    • 2014-07-09
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多