Извлеките целочисленное значение из строки и убедитесь, что оно больше или меньше заданного целого - PullRequest
0 голосов
/ 28 октября 2019

У меня есть следующая команда 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 МиБ, 8,3 Mib, 4.7 MiB и т. Д. ... и проверьте минимальный порог. Если какой-либо из этих сегментов меньше 3,0 МБ, он напечатает название этого сегмента и скажет мне, в противном случае он будет продолжен.

В этом примере только один из них имеет размер менее 3,0 МБ, поэтому он напечатает:

2019-10-13 15:00:22 2,9 МБ 2012/11/01 /00 / 2012-11-01T00: 14: 00Z.txt.gz

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

Вот потенциальное решение, которое преобразует размер в байтах на основе массива, который отображает имя устройства (например, MiB) на количество байтов.

РЕДАКТИРОВАНИЕ: Как только в начале строки появится текст «Всего объектов:», программа закроется. Кроме того, любые строки, которые имеют менее 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 голос
/ 28 октября 2019

awk отлично подходит для обработки строк данных с полями в нем:

echo "$your_data" | awk '$3 < 3 {print $5}'

Этот код предполагает, что поля всегда такие и никогда не содержат пробелов. Также предполагается, что все размеры в третьем столбце даны как MiB.

(Возможно, вы захотите предварительно обработать данные перед тем, как отправить их в awk, чтобы удалить конечную сводку, или изменить скрипт awk, чтобы иметь дело со сводкой.)

РЕДАКТИРОВАТЬ: Если единицы измерения также доступны в КиБ, вам также необходимо проверить $4. Смотрите man awk о том, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...