如何使用bash和printf转换日期格式?
我想使用如何使用bash和printf转换日期格式?,bash,awk,printf,Bash,Awk,Printf,我想使用awk和printf在bash中将2019-02-16转换为2月16日15:29 例如: [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
awk
和printf
在bash中将2019-02-16
转换为2月16日15:29
例如:
[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
请提供帮助并解释您的解决方案 您可以使用strftime()
在任何UNIX设备上的任何shell中使用任何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
或通过管道将输出传输到列-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
在gawk
中使用strftime(,mktime())
,使用非字符正则表达式字段分隔符(-F
标志):
大致如上文所述,唉,用
mktime()
语法跟随你的IO。如果没有人想出一个优雅的解决方案,你可以从date--date=$(who | awk'{print$3,$4}')
@CharlesDuffy开始制作一些丑陋的东西,我想是的。第一种方法只需要获取用户,而消除了其他方法。您应该提到,时间函数需要GNU awk。另外,systime()将告诉您系统上的当前时间-您需要使用mktime()将输入的时间转换为自历元起的秒数。还有一些语法错误,大括号放错了位置,缺少paren。最后-很明显,这不能产生预期的多字段输出,因为它只对其中一个输入字段起作用。@EdMorton谢谢,特别是在strftime
之后,我忘记放第一个括号和第一个大括号,现在我修复了。不客气。我仍然会打印工具执行的时间,而不是输入文件中的时间。@EdMorton在我的屏幕上,$date-->Sun Feb 17 18:42:23+03 2019
,$who-->oracle tty1 2019-02-17 00:03(:0)
,$uname-r-->4.1.12.103.9.7.el6uek.x86_64
上述命令的结果是oracle Feb 17 18:42
运行字符串字典偏移量查找的很好使用。为什么秒部分默认为00
@stack0114106它们不必默认,只是它们不存在于OP的数据中,和是mktime()
的参数列表.sry.中必需的。我得到的输出是root-Feb 16 15:00
,而不是Feb 16 15:29
@stack0114106-WOOPS!日期格式尾部应为%H:%M
,而不是%H:%S
,这显然意味着秒数已编辑。干杯
$ 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
your_output |gawk -F'\\W' '
{print $1 , strftime("%b %d %H:%M",mktime($2 " " $3 " " $4 " " $5 " " $6 " 00"))}
'