从字符串中解析一个整数值,并检查它是否大于或小于给定的整数

时间:2019-10-28 16:10:28

标签: bash shell amazon-s3 sed

我有以下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

2 个答案:

答案 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