Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用bash和printf转换日期格式?_Bash_Awk_Printf - Fatal编程技术网

如何使用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"))}
'