在awk
, 脚本中我使用命令
system(date)
打印文件中的当前日期,但执行此命令后,还会隐式添加下一行。有没有办法在awk
不添加新行的情况下打印当前日期,以便我接下来打印的任何内容都在同一行中?
答案1
该date
命令在其输出末尾添加换行符。您可以将输出读入 awk 并使其打印,而无需附加换行符。
"date" | getline date; printf "%s", date
除非您的脚本长时间运行,否则您也可以获取启动脚本的日期。
awk -v date="$(date)" '
… printf "%s", date …
'
答案2
GNUawk
和@托马斯迪基的mawk
实现awk
有一些与时间和日期功能相关的扩展。有了这些,你就可以使用
strftime("%+", systime())
获取与date
实用程序生成的格式相同的字符串表示形式。
或者,对于稍微不同的格式,但更便携(适用于非 BSD 系统),
strftime("%c", systime())
测试:
$ date
Mon Jan 28 11:22:22 CET 2019
$ gawk 'BEGIN { print strftime("%+", systime()) }'
Mon Jan 28 11:22:27 CET 2019
$ mawk 'BEGIN { print strftime("%+", systime()) }'
Mon Jan 28 11:22:33 CET 2019
如果%+
您的系统不支持该格式(不在 中glibc2
),那么%c
可能会生成与此非常接近的格式。确切的格式将取决于strftime()
C 库中的实现以及当前与日期时间相关的区域设置。在C
/POSIX
区域设置中,您将获得与上面相同的输出,但没有时区缩写。
BSDawk
实现默认情况下可能没有这些功能。
也可以看看:
- 系统上的
awk
和(用于时间/日期戳格式化)的手册。strftime