【问题标题】:AWK positional variables processingAWK 位置变量处理
【发布时间】:2021-12-19 19:37:21
【问题描述】:

这是我来自 db 的数据

"1.1.1.1|1636057103"

我如何在 AWK 中使用 date +'%d.%m.%y %H:%M:%S' -d @1636057103 之类的东西来转换 $2 变量中的 unix 时间戳以获得如下输出:

"1.1.1.1 - 04.11.21 22:18:23"

?

谢谢!

【问题讨论】:

  • 使用awk吗?输入是字符串还是文件?您是否必须为多行输入执行此格式化?输入(和输出)是否包含在一对双引号中(即双引号是“来自 db 的数据”的一部分)?

标签: variables awk command substitution


【解决方案1】:

使用 GNU awk 及其 strftime

awk -F '["|]' '{$3=strftime("%d.%m.%Y %H:%M:%S", $3); print "\"" $2 " - " $3 "\""}' file

awk -F '["|]' '{$0=strftime("\"" $2 " - %d.%m.%Y %H:%M:%S\"", $3)}1' file

输出:

“1.1.1.1 - 04.11.2021 21:18:23”

见:9.1.5 Time Functions

【讨论】:

  • 我会小心在 strftime 格式字符串中使用未知字符串。
【解决方案2】:

假设:

  • 数据包含文字双引号作为书挡
  • 数据存储在变量中
  • 重新格式化的数据以双引号作为书挡存储在新变量中

使用一些基本的bash参数替换/扩展运算符:

data='"1.1.1.1|1636057103"'
data="${data//\"}"                 # strip double quotes
ip="${data%|*}"                    # break into ip and ...
epoch="${data#*|}"                 # epoch

# build new variable:

printf -v newddata "\"${ip} - '%(%d.%m.%y %H:%M:%S)T' @${epoch}" "\""
echo "${newdata}"

这会生成:

"1.1.1.1 - 04.11.21 15:18:23"

注意:小时部分与 OP 的示例输出不同,可能是由于我们的时区不同

【讨论】:

    猜你喜欢
    • 2019-12-08
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多