【问题标题】:use jq to format output and convert timestamp使用 jq 格式化输出并转换时间戳
【发布时间】:2026-01-08 19:00:02
【问题描述】:

我有以下代码,其中列出了我帐户中所有当前的 aws lambda 函数:

aws lambda list-functions --region eu-west-1 | jq -r '.Functions | .[] | .FunctionName' | xargs -L1 -I {} aws logs describe-log-streams --log-group-name /aws/lambda/{} | jq 'select(.logStreams[-1] != null)' | jq -r '.logStreams | .[] | [.arn, .lastEventTimestamp] | @csv'

返回

aws:logs:eu-west-1:****:log-group:/aws/lambda/admin-devices-block-master:log-stream:2018/01/23/[$LATEST]64965367852942f490305cb8707d81b4",1516717768514


我只对admin-devices-block-master 感兴趣,我想将时间戳1516717768514 转换为strflocaltime("%Y-%m-%d %I:%M%p")

所以它应该只是返回:

"admin-devices-block-master",1516717768514

我试过了

aws lambda list-functions --region eu-west-1 | jq -r '.Functions | .[] | .FunctionName' | xargs -L1 -I {} aws logs describe-log-streams --log-group-name /aws/lambda/{} | jq 'select(.logStreams[-1] != null)' | jq -r '.logStreams | .[] | [.arn,[.lastEventTimestamp|./1000|strflocaltime("%Y-%m-%d %I:%M%p")]]' 
jq: error: strflocaltime/1 is not defined at <top-level>, line 1:
.logStreams | .[] | [.arn,[.lastEventTimestamp|./1000|strflocaltime("%Y-%m-%d %I:%M%p")]]                                                      
jq: 1 compile error
^CException ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
BrokenPipeError: [Errno 32] Broken pipe

非常感谢任何建议

【问题讨论】:

  • 你能提供一个小的json例子吗?
  • strflocaltime() 需要 jq 1.6 版。你有什么版本?
  • 另一种方法是使用strftime()
  • @oliv 我有jq-1.5-1-a5b5cbe 会更新

标签: json jq


【解决方案1】:

strflocaltime需要jq 1.6版,感谢@oliv 备注。

这是一个非常简单的示例,它将用本地时间用毫秒替换 EPOCH。

date  -d @1572892409
Mon Nov  4 13:33:29 EST 2019

echo '{ "ts" : 1572892409356 , "id": 2 , "v": "foobar" } ' | \
          jq '.ts|=( ./1000|strflocaltime("%Y-%m-%d %I:%M%p")) '

{
  "ts": "2019-11-04 01:33PM",
  "id": 2,
  "v": "foobar"
}

测试ts 是否存在的第二个版本

( 
  echo '{ "ts" : 1572892409356 , "id": 2 , "v": "foobar" } ' ; 
  echo '{ "id":3 }' ; 
  echo '{ "id": 4 , "v": "barfoo" }' 
) | jq 'if .ts != null 
        then  ( .ts|=( ./1000|strflocaltime("%Y-%m-%d %I:%M%p")) ) 
        else  . 
        end '

【讨论】:

  • 谢谢你,非常有帮助,我遇到了一个错误jq: error (at &lt;stdin&gt;:8686): strflocaltime/1 requires parsed datetime inputs 这是没有时间戳的时候有没有办法忽略这个,这就是我目前所拥有的? aws lambda list-functions --region eu-west-1 | jq -r '.Functions | .[] | .FunctionName' | xargs -L1 -I {} aws logs describe-log-streams --log-group-name /aws/lambda/{} | jq 'select(.logStreams[-1] != null)' | jq -r '.logStreams | .[] | [.arn,.lastEventTimestamp|=(strflocaltime("%Y-%m-%d %I:%M%p"))]'
最近更新 更多