Como usar o AWS S3 CLI para despejar arquivos no stdout no BASH?


90

Estou iniciando um script bash que pegará um caminho no S3 (conforme especificado para o comando ls ) e despejará o conteúdo de todos os objetos de arquivo em stdout. Essencialmente, gostaria de replicar, cat /path/to/files/*exceto para S3, por exemplo s3cat '/bucket/path/to/files/*'. Minha primeira inclinação ao olhar as opções é usar o cpcomando para um arquivo temporário e depois catisso.

Alguém já tentou isso ou algo semelhante ou já existe um comando que não estou encontrando qual é?


Eu uso o PHP e a classe Services_Amazon_S3 para fazer coisas semelhantes.
Mal entendido

Respostas:


147

despejar o conteúdo de todos os objetos de arquivo em stdout.

Você pode fazer isso se passar -por destino de aws s3 cpcomando. Por exemplo $ aws s3 cp s3://mybucket/stream.txt -,.

O que você está tentando fazer é algo assim? ::

#!/bin/bash

BUCKET=YOUR-BUCKET-NAME
for key in `aws s3api list-objects --bucket $BUCKET --prefix bucket/path/to/files/ | jq -r '.Contents[].Key'`
do
  echo $key
  aws s3 cp s3://$BUCKET/$key - | md5sum
done

5
Observe, entretanto, que '-' como um marcador de posição para stdout não funciona em todas as versões do awscli. Por exemplo, a versão 1.2.9, que vem com o ubuntu LTS 14.04.2, não é compatível.
antoniob

Idem. Estou no Ubuntu 12.x, e ele não funciona na minha instância do bash.
Kode Charlie

O problema com isso é que você não pode obter uma versão específica do arquivo.
Eamorr

não trabalhando em MacOS High Sierra 10.13.6 ou ( aws --version: aws-cli/1.15.40 Python/3.6.5 Darwin/17.7.0 botocore/1.10.40)
MichaelChirico

essa resposta também tem a vantagem de que o conteúdo do arquivo será transmitido para o seu terminal, e não copiado como um todo. veja mais em loige.co/aws-command-line-s3-content-from-stdin-or-to-stdout/…
Khoa

47

Se você estiver usando uma versão do AWS CLI que não suporta a cópia para "-", você também pode usar / dev / stdout:

$ aws s3 cp --quiet s3://mybucket/stream.txt /dev/stdout

Você também pode querer que o --quietsinalizador evite que uma linha de resumo como a seguinte seja anexada à sua saída:

download: s3: //mybucket/stream.txt para ../../dev/stdout


1

Você pode tentar usar s3streamcat , ele suporta os formatos bzip, gzip e xz também.

Instale com

sudo pip install s3streamcat

Uso:

s3streamcat s3://bucketname/dir/file_path
s3streamcat s3://bucketname/dir/file_path | more
s3streamcat s3://bucketname/dir/file_path | grep something


-3

Se desejar fazer isso usando o BASH, você terá que chamar um aplicativo externo, como a AWS Command-Line Interface (CLI). Ele não tem um equivalente CAT, então você precisaria copiar o arquivo localmente e então fazer o CAT.

Como alternativa, você pode usar / escrever um aplicativo que chama diretamente o SDK da AWS, que está disponível para linguagens como Python, PHP, Java. Usando o SDK, o conteúdo do arquivo pode ser recuperado na memória e enviado para stdout.


A resposta acima lista que você pode usar 'cp' com '-' como o segundo argumento do arquivo para torná-lo a saída do arquivo para stdout.
Asfand Qazi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.