我有以下AWS CLI命令,该命令计算所有存储桶的大小:
aws s3 ls --summarize --human-readable --recursive s3://my-bucket/2012/
运行此命令时,它会打印到许多行,例如(摘录的小片段):
2019-10-13 14:59:33 6.4 MiB 2012/11/01/00/2012-11-01T00:00:00Z.txt.gz
2019-10-13 15:00:14 8.3 MiB 2012/11/01/00/2012-11-01T00:01:00Z.txt.gz
2019-10-13 15:00:06 4.7 MiB 2012/11/01/00/2012-11-01T00:02:00Z.txt.gz
2019-10-13 15:00:14 4.3 MiB 2012/11/01/00/2012-11-01T00:03:00Z.txt.gz
2019-10-13 14:59:33 4.3 MiB 2012/11/01/00/2012-11-01T00:04:00Z.txt.gz
2019-10-13 15:00:11 4.0 MiB 2012/11/01/00/2012-11-01T00:05:00Z.txt.gz
2019-10-13 15:00:11 3.9 MiB 2012/11/01/00/2012-11-01T00:06:00Z.txt.gz
2019-10-13 14:59:43 3.8 MiB 2012/11/01/00/2012-11-01T00:07:00Z.txt.gz
2019-10-13 14:59:56 3.6 MiB 2012/11/01/00/2012-11-01T00:08:00Z.txt.gz
2019-10-13 15:00:14 3.8 MiB 2012/11/01/00/2012-11-01T00:09:00Z.txt.gz
2019-10-13 15:00:14 4.0 MiB 2012/11/01/00/2012-11-01T00:10:00Z.txt.gz
2019-10-13 15:00:17 4.1 MiB 2012/11/01/00/2012-11-01T00:11:00Z.txt.gz
2019-10-13 15:00:17 3.9 MiB 2012/11/01/00/2012-11-01T00:12:00Z.txt.gz
2019-10-13 15:00:17 3.8 MiB 2012/11/01/00/2012-11-01T00:13:00Z.txt.gz
2019-10-13 15:00:22 2.9 MiB 2012/11/01/00/2012-11-01T00:14:00Z.txt.gz
2019-10-13 15:00:37 4.3 MiB 2012/11/01/00/2012-11-01T00:15:00Z.txt.gz
Total Objects: 300
Total Size: 1.7 GiB
我正在尝试查看是否可以使用Bash / Shell脚本来解析每个存储分区的大小,例如 6.4 MiB, 8.3 Mib, 4.7 MiB等...,并检查最低阈值。如果这些存储桶中的任何一个低于3.0 MiB,它将打印该存储桶的名称并告诉我,否则它将继续。
在此示例中,只有其中一个在3.0 MiB以下,因此它将打印:
2019-10-13 15:00:22 2.9 MiB 2012/11/01/00 / 2012-11-01T00:14:00Z.txt.gz
答案 0 :(得分:2)
这是一个潜在的解决方案,它可以根据将单位名称(例如MiB)映射到字节数的数组,将大小转换为字节。
编辑:一旦文本“ Total Objects:”出现在一行的开头,程序将退出。同样,任何少于5个字段的行都将被静默忽略。
aws s3 ls --summarize --human-readable --recursive s3://my-bucket/2012/ | \
awk -v threshold_in_bytes=$((3*1024*1024)) '
BEGIN {
units["TiB"]=1024*1024*1024*1024
units["GiB"]=1024*1024*1024
units["MiB"]=1024*1024
units["KiB"]=1024
units["B"]=1
}
/^Total Objects:/ {
exit
}
NF >= 5 {
if ($4 in units) {
if ($3 * units[$4] < threshold_in_bytes) {
print $0
}
}
else {
print "Error: Unknown unit on line " NR ": " $0
}
}
'
答案 1 :(得分:1)
awk
非常适合处理其中包含字段的数据行:
echo "$your_data" | awk '$3 < 3 {print $5}'
此代码假定字段始终像这样,并且绝不包含空格。它还假定第三列中的所有大小均以MiB给出。
(您可能需要先对数据进行预处理,然后再将其交给awk来删除尾随的摘要,或者修改awk脚本以处理该摘要。)
编辑:如果单位还可以在KiB中使用,则还必须检查$4
。有关如何操作,请参见man awk。