Comment utiliser AWS S3 CLI pour vider des fichiers sur stdout dans BASH?

90

Je démarre un script bash qui prendra un chemin dans S3 (comme spécifié à la commande ls ) et videra le contenu de tous les objets de fichier dans stdout. Essentiellement, je voudrais répliquer cat /path/to/files/*sauf pour S3, par exemple s3cat '/bucket/path/to/files/*'. Ma première inclinaison en regardant les options est d'utiliser la cpcommande dans un fichier temporaire et ensuite catcela.

Quelqu'un a-t-il essayé ceci ou similaire ou y a-t-il déjà une commande que je ne trouve pas qui le fait?

Neil C. Obremski
la source
J'utilise PHP et la classe Services_Amazon_S3 pour faire des choses similaires.
mal compris le

Réponses:

147

vider le contenu de tous les objets fichier sur stdout.

Vous pouvez accomplir cela si vous passez -pour la destination de la aws s3 cpcommande. Par exemple $ aws s3 cp s3://mybucket/stream.txt -,.

Ce que vous essayez de faire est quelque chose comme ça? ::

#!/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
trembler
la source
5
Notez cependant que «-» comme espace réservé pour stdout ne fonctionne pas dans toutes les versions de awscli. Par exemple, la version 1.2.9, fournie avec ubuntu LTS 14.04.2, ne le prend pas en charge.
antoniob
Idem ça. Je suis sur Ubuntu 12.x, et cela ne fonctionne pas dans mon instance de bash.
Kode Charlie
Le problème avec cela est que vous ne pouvez pas obtenir une version spécifique du fichier.
Eamorr le
ne fonctionne pas sur macOS High Sierra 10.13.6 soit ( aws --version: aws-cli/1.15.40 Python/3.6.5 Darwin/17.7.0 botocore/1.10.40)
MichaelChirico
cette réponse présente également l'avantage que le contenu du fichier sera diffusé sur votre terminal et non copié dans son ensemble. voir plus sur loige.co/aws-command-line-s3-content-from-stdin-or-to-stdout
Khoa
47

Si vous utilisez une version de l'AWS CLI qui ne prend pas en charge la copie vers "-", vous pouvez également utiliser / dev / stdout:

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

Vous pouvez également souhaiter que l' --quietindicateur empêche une ligne de résumé comme celle-ci d'être ajoutée à votre sortie:

télécharger: s3: //mybucket/stream.txt vers ../../dev/stdout

A dessiné
la source
1

Vous pouvez essayer d'utiliser s3streamcat , il prend également en charge les formats bzip, gzip et xz.

Installer avec

sudo pip install s3streamcat

Usage:

s3streamcat s3://bucketname/dir/file_path
s3streamcat s3://bucketname/dir/file_path | more
s3streamcat s3://bucketname/dir/file_path | grep something
Samarth
la source
-3

Si vous souhaitez accomplir cela à l'aide de BASH, vous devrez appeler une application externe telle que l' AWS Command-Line Interface (CLI). Il n'a pas d'équivalent CAT, vous devez donc copier le fichier localement, puis le CAT.

Vous pouvez également utiliser / écrire une application qui appelle directement le kit AWS SDK, qui est disponible pour des langages tels que Python, PHP, Java. En utilisant le SDK, le contenu du fichier peut être récupéré en mémoire, puis envoyé à stdout.

John Rotenstein
la source
Les listes de réponses ci-dessus que vous pouvez utiliser «cp» avec «-» comme deuxième argument de fichier pour lui faire sortir le fichier vers stdout.
Asfand Qazi