zgrep S3 bucket из скрипта

#python-3.x #amazon-s3 #aws-cli

#python-3.x #amazon-s3 #aws-cli

Вопрос:

Если я хочу получить grep-файл из терминала, я могу использовать AWS CLI следующим образом:

 aws s3 cp s3://path/to/file/filename.tsv.gz - | zgrep 12345
  

Я бы хотел сделать это рекурсивно из скрипта. Пока я делаю это

 import boto3

s3_client = boto3.client('s3')
obj = s3_client.get_object(Bucket=bucket, Key=prefix   file_name)
body = obj['Body'] 
with gzip.open(body, 'rt') as gf:
    for ln in gf:
        if string in ln:
            print(string)
  

Это работает нормально, но на самом деле это не очень быстро. Поэтому я хотел бы использовать вместо этого zgrep.

Я пробовал

 import subprocess

cp = 'aws s3 cp s3://'   bucket   '/'   prefix   file_name   ' - | zgrep '   string

result = subprocess.run(cp, check=True, shell=True, stdout=subprocess.PIPE)
print(result)
  

Но получить subprocess.CalledProcessError как команду returned non-zero exit status 1

Комментарии:

1. Вы говорите: «на самом деле это не очень быстро». Вы исследовали, тратится ли время на загрузку или поиск? Если вы собираетесь выполнять несколько поисковых запросов, было бы более эффективно sync размещать содержимое на вашем локальном диске, а затем grep локально. Это позволяет избежать повторной загрузки файлов каждый раз.

2. сценарий, который я написал, предназначен для предотвращения локальной загрузки. Мне нужно иметь возможность находить строку непосредственно из корзины, поскольку это только для устранения неполадок, и есть довольно большие файлы, и строка может быть в нескольких файлах.

3. Но каждый раз, когда вы запускаете aws s3 cp , он загружает файл. Выходные данные отправляются stdout по каналу, а затем теряются. Итак, при следующем запуске команды она снова загружает файл, но не сохраняет его на диск. Таким образом, большая часть времени, вероятно, тратится на загрузку содержимого файла. Вы также будете платить за передачу данных каждый раз.

4. да, но файлы всегда разные, поэтому локальное выполнение будет таким же. но, по крайней мере, мне не нужно хранить огромные файлы локально, и script создает файл с найденными вхождениями строки