如何使用bash和printf转换日期格式?

时间:2019-02-16 20:58:46

标签: bash awk printf

我想使用2019-02-16Feb 16 15:29awk转换为printf

例如:

[root@localhost ~]# who | awk '{print $1, $3, $4}'
root 2019-02-16 15:29
root 2019-02-16 15:30
john 2019-02-01 10:34
emmett 2019-01-12 09:45

所需的输出:

root Feb 16 15:29
root Feb 16 15:30
john Feb 1  10:34
emmett Jan 12 09:45

请提供帮助并提供解决方案的说明。

3 个答案:

答案 0 :(得分:2)

在任何UNIX盒子上的任何外壳中都有任何awk:

$ who | awk '{split($3,d,/-/); print $1, substr("JanFebMarAprMayJunJulAugSepOctNovDec",(d[2]*3)-2,3), d[3]+0, $4}'

例如:

$ cat file
root 2019-02-16 15:29
root 2019-02-16 15:30
john 2019-02-01 10:34
emmett 2019-01-12 09:45

$ awk '{split($2,d,/-/); print $1, substr("JanFebMarAprMayJunJulAugSepOctNovDec",(d[2]*3)-2,3), d[3]+0, $3}' file
root Feb 16 15:29
root Feb 16 15:30
john Feb 1 10:34
emmett Jan 12 09:45

如果对齐方式很重要,则有多种解决方案,包括使用printf代替print:

$ awk -v OFS='\t' '{split($2,d,/-/); printf "%s %s %-2d %s\n", $1, substr("JanFebMarAprMayJunJulAugSepOctNovDec",(d[2]*3)-2,3), d[3]+0, $3}' file
root Feb 16 15:29
root Feb 16 15:30
john Feb 1  10:34
emmett Jan 12 09:45

或使用制表符(而不是空格)分隔输出:

$ awk -v OFS='\t' '{split($2,d,/-/); print $1, substr("JanFebMarAprMayJunJulAugSepOctNovDec",(d[2]*3)-2,3), d[3]+0, $3}' file
root    Feb     16      15:29
root    Feb     16      15:30
john    Feb     1       10:34
emmett  Jan     12      09:45

或将输出通过管道传递到column -t

$ awk '{split($2,d,/-/); print $1, substr("JanFebMarAprMayJunJulAugSepOctNovDec",(d[2]*3)-2,3), d[3]+0, $3}' file | column -t
root    Feb  16  15:29
root    Feb  16  15:30
john    Feb  1   10:34
emmett  Jan  12  09:45

答案 1 :(得分:1)

您可以使用strftime()

$ who | awk '{print $1}' | awk -F '[-]' '{ print $1, strftime ("%b %d %H:%M", systime()) }'

答案 2 :(得分:1)

使用非字符正则表达式 Field Separator strftime(,mktime())标志)在gawk中使用-F

your_output |gawk -F'\\W' '
    {print $1 , strftime("%b %d %H:%M",mktime($2 " " $3 " " $4 " " $5 " " $6 " 00"))}
'

上面所说的大致相同,可惜您的IO使用mktime()语法。