有人能解释一下下面的代码吗?
下面的代码使用username生成预期的结果。
for row in $(echo "${es_eh}" | jq -r '.Events[] | @base64'); do
echo "${row}" | base64 --decode | jq -r '.Username'
我不明白在循环中对同一个字符串进行base64编码和解码以检索用户名的目的。
当我删除base64编码和解码时,这不起作用。
for row in $(echo "${es_eh}" | jq -r '.Events[]'); do
echo "${row}"| jq -r '.Username'
es_eh包含下面的aws命令的json输出,
es_eh="$(aws cloudtrail --region us-east-1 lookup-events --lookup-attributes AttributeKey=EventSource,AttributeValue=route53.amazonaws.com --max-items 50 --start-time "${start_date}" --end-time "${end_date}" --output json)"
3条答案
按热度按时间d5vmydt91#
如果不使用编码,第一个
jq
的输出将不止一行。循环将遍历各行,但由于没有一行包含有效的JSON而失败。如果使用| @base64
,每个子对象将被编码为一行,并通过base64 --decode
膨胀回完整的JSON对象。要查看行,请尝试在处理$row之前输出它。
wgmfuz8q2#
当你使用
$( )
而不加引号时,结果会被拆分成“单词”,但是shell对“单词”的定义几乎从来都不是你想要的(当然也和你想要拆分成的json条目无关),这就是为什么你几乎不应该使用不加引号的扩展。将输出条目转换为base64会使它们变得非常像单词,因此shell单词拆分实际上是正确的。一些base64编码器将它们的输出分割成行,这将使得每行被视为单独的“字”。如果
jq
的base64编码这样做,则该代码在大事件时将灾难性地失败。5lwkijsr3#
将
for
循环转换为while
循环应该可以修复此问题:注意,在外部
jq
中,我使用了选项-c
将输出放在一行中。