我是新的Bash脚本,想测试提取数据,我的计划是提取数据到一个.txt文件的基础上的AWS查询从.sh文件(JavaScript脚本)。我有一个更大的目的,但我想有这个工作之前,我输入我的主要aws查询。
下面有一个.sh脚本。
注:我把所有的价值观-保密-没有任何报价。仅值
#!/bin/bash
variables () {
lambdas="confidential"
}
variables
queryId=$(aws logs start-query --log-group-name $lambdas --start-time 1695704400 --end-time 1695707999 --query-string 'filter @message like "requestId" | parse @message "operationName: '*'," as API | parse @message "status: *," as Status | parse @message "channel: '*'," as Channel | stats count(*) as Total by API,Channel,Status | sort API,Total desc' | jq '.queryId' | awk -F '"' '{print $2}')
results=$(aws logs get-query-results --query-id $queryId | jq .)
echo "$results" > testextract5.txt
每当我运行.sh文件时,下面是结果.txt:
{
"results": [],
"statistics": {
"recordsMatched": 0,
"recordsScanned": 0,
"bytesScanned": 0
},
"status": "Running"
}
但当我手动复制粘贴每个命令从.sh文件所有的bash脚本在git-bash命令行,它的工作!见下文:
jomasangkay@DESKTOP-R1DM530:/mnt/c/Users/personal pc/Desktop/company/Bashscript/test$ queryId=$(aws logs start-query --log-group-name $lambdas --start-time 1695704400 --end-time 1695707999 --query-string 'filter @message like "requestId" | parse @message "operationName: '*'," as API | parse @message "status: *," as Status | parse @message "channel: '*'" as Channel | stats count(*) as Total by API,Channel,Status | sort API,Total desc' | jq '.queryId' | awk -F '"' '{print $2}')
jomasangkay@DESKTOP-R1DM530:/mnt/c/Users/personal pc/Desktop/company/Bashscript/test$ results=$(aws logs get-query-results --query-id $queryId | jq .)
jomasangkay@DESKTOP-R1DM530:/mnt/c/Users/personal pc/Desktop/company/Bashscript/test$ echo "$results" > testextract5.txt
下面是提取的结果.txt,
{
"field": "API",
"value": "'Confidential'"
},
{
"field": "Channel",
"value": "'Confidential'"
},
{
"field": "Status",
"value": "Confidential"
},
{
"field": "Total",
"value": "1"
}
]
],
"statistics": {
"recordsMatched": 16507,
"recordsScanned": 69000,
"bytesScanned": 29835564
},
"status": "Complete"
}
采取的行动/未来计划:
我尝试排除故障,并使用bash -x script.sh,但我没有看到任何问题。我试着回滚到wsl版本1,安装了最新的aws更新。都不管用我的剧本有问题吗?
我希望当我运行.sh文件时,应该有像上面的.txt结果这样的预期数据。我创建这个bash脚本的主要目的是因为AWS Cloudwatch Log Insights有一个与lambda相关的限制,所以我计划创建一个bash脚本,在$lambda中使用数组。这篇文章是我的试验和错误。我需要让这件事继续下去。
尝试了$lambda和$queryId的双引号,结果相同,没有数据。下面
jomasangkay@DESKTOP-R1DM530:/mnt/c/Users/personal pc/Desktop/company/Bashscript/test$ bash -x testing2.sh
+ variables
+ lambdas=confidential
++ jq .queryId
++ awk -F '"' '{print $2}'
++ aws logs start-query --log-group-name confidential --start-time 1695704400 --end-time 1695707999 --query-string 'filter @message like "requestId" | parse @message "operationName: *," as API | parse @message "status: *," as Status | parse @message "channel: *," as Channel | stats count(*) as Total by API,Channel,Status | sort API,Total desc'
+ queryId=0f6c6fd6-da5e-40ed-9c74-ad22791455be
++ aws logs get-query-results --query-id 0f6c6fd6-da5e-40ed-9c74-ad22791455be
++ jq .
+ results='{
"results": [],
"statistics": {
"recordsMatched": 0,
"recordsScanned": 0,
"bytesScanned": 0
},
"status": "Running"
}'
+ echo '{
"results": [],
"statistics": {
"recordsMatched": 0,
"recordsScanned": 0,
"bytesScanned": 0
},
"status": "Running"
}'
===============================
更新于2023年10月3日-新加坡时间上午05:15
我通过创建一个名为test1.txt和test2.txt的2.txt文件来隔离这个问题,下面是它们的内容,
test1.txt
c86c7f6b-95e4-4d17-9417-2f6987989316
test2.txt
c86c7f6b-95e4-4d17-9417-2f6987989316
正如你在上面看到的,它们具有完全相同的值(没有空格,没有不寻常的文本或任何东西)。
请参阅下面的新修改代码,
#!/bin/bash
variables () {
lambdas="confidential"
}
variables
queryId=$(aws logs start-query --log-group-name "$lambdas" --start-time 1695704400 --end-time 1695707999 --query-string 'filter @message like "requestId"' | jq '.queryId' | awk -F '"' '{print $2}')
#NOT WORKING
echo $queryId > test1.txt
#WORKING
echo c86c7f6b-95e4-4d17-9417-2f6987989316 > test2.txt
queryIds=$(awk '{print $1}' test2.txt)
results=$(aws logs get-query-results --query-id $queryIds | jq .)
echo "$results" > testextract.txt
当我从test1.txt中分配变量时,它不工作,没有提取数据。
当我从test2.txt中分配变量时,它按预期工作。
出于某种原因,看起来像从test1.txt查询ID转换为有点特殊的字符值,我不确定。
2条答案
按热度按时间zzzyeukh1#
重复
aws logs get-query-results
直到有结果正如我们在问题的更新输出中看到的,对
aws logs get-query-results
的响应是"status": "Running"
。查询仍然在AWS上运行,结果还没有准备好,无法下载。所以我们只需要稍后再次调用aws logs get-query-results
。根据documentation,有效状态值为
Scheduled | Running | Complete | Failed | Cancelled | Timeout | Unknown
。您可以尝试在循环中重复获取结果,直到状态不是Scheduled
或Running
之一:红鲱鱼
这一点,原本看起来就有些可疑:
也就是说,一个“裸”
*
,在单引号表达式之外,这看起来是无意的,而且容易出错。其意图似乎是将
'*'
包含在单引号表达式中,我们可以通过添加单引号来结束正在进行的单引号表达式,然后在双引号表达式中添加'*'
,然后启动另一个单引号表达式来继续我们中断的表达式:修复发布的代码中的行:
虽然这不是真实的问题,但仍然很好解决。
4xrmg8kj2#
我能够解决我的问题。这是由于bash脚本运行太快,AWS脚本无法完成其进程或获取其数据。因此,我尝试先将sleep命令放置5秒,以检查是否真的是这样。那么是的,这就是问题所在,所以我只需要写一个条件语句来代替sleep……谢谢大家的建议,我从你们身上学到了很多。