web-dev-qa-db-fra.com

Commande "head" pour aws s3 pour afficher le contenu du fichier

Sous Linux, nous utilisons généralement les commandes head/tail pour prévisualiser le contenu d'un fichier. Cela aide à visualiser une partie du fichier (pour inspecter le format par exemple), plutôt que d'ouvrir tout le fichier.

Dans le cas d'Amazon S3, il semble qu'il n'y ait que ls, cp, mv etc. commandes Je voulais savoir s'il est possible d'afficher une partie du fichier sans télécharger l'intégralité du fichier sur ma machine locale à l'aide de cp /OBTENIR.

13
nutsiepully

Vous pouvez spécifier une plage d'octets lors de l'extraction de données de S3 pour obtenir les N premiers octets, les derniers N octets ou tout autre élément intermédiaire. (Ceci est également utile car il vous permet de télécharger des fichiers en parallèle - démarrez simplement plusieurs threads ou processus, chacun récupérant une partie du fichier total.)

Je ne sais pas lequel des différents outils CLI prend en charge cette fonctionnalité directement, mais une récupération de plage fait ce que vous voulez.

Les outils de l'AWS CLI ("aws s3 cp" pour être précis) ne vous permettent pas de récupérer des plages, mais s3curl ( http://aws.Amazon.com/code/128 ) devrait suffire. utilise simplement le paramètre --range mais vous devrez alors signer vous-même la requête.) 

6
Michael Hanisch

Une chose que vous pouvez faire est de cp l’objet à stout puis de le diriger vers la tête:

aws s3 cp s3://path/to/my/object - | head

Vous obtenez une erreur de tuyau cassé à la fin mais cela fonctionne.

36
dspringate

Vous pouvez utiliser le commutateur range sur l'ancienne commande s3api get-object pour récupérer les premiers octets d'un objet s3. (AFAICT s3 ne prend pas en charge le commutateur.)

Le tube \dev\stdout peut être passé en tant que nom de fichier cible si vous souhaitez simplement afficher l'objet S3 en effectuant un transfert vers head. Voici un exemple:

aws s3api get-object --bucket mybucket_name --key path/to/the/file.log --range bytes=0-10000 /dev/stdout | head

Enfin, si comme moi vous traitez avec des fichiers .gz compressés, la technique ci-dessus fonctionne également avec zless, ce qui vous permet d'afficher la tête du fichier décompressé:

aws s3api get-object --bucket mybucket_name --key path/to/the/file.log.gz --range bytes=0-10000 /dev/stdout | zless

Un conseil avec zless: si cela ne fonctionne pas, essayez d’augmenter la taille de la plage.

6
Ben Hutchison

Si vous ne souhaitez pas télécharger l'intégralité du fichier, vous pouvez en télécharger une partie à l'aide de l'option --range spécifiée dans la commande aws s3api. Une fois la partie du fichier téléchargée, exécutez une commande head sur ce fichier.

Exemple:

aws s3api get-object --bucket my_s3_bucket --key s3_folder/file.txt --range bytes=0-1000000 tmp_file.txt && head tmp_file.txt

Explication:

Le aws s3api get-object télécharge une partie du fichier s3 du compartiment et du dossier s3 spécifiés avec la taille spécifiée dans --range dans un fichier de sortie spécifié. Le && exécute la deuxième commande uniquement si la première a successed. La deuxième commande affiche les 10 premières lignes du fichier de sortie créé précédemment.

4
Yaniv

Il n'y a pas une telle capacité. Vous ne pouvez récupérer que l'objet entier. Vous pouvez exécuter une requête HTTP HEAD pour afficher les métadonnées de l'objet, mais ce n'est pas ce que vous recherchez.

0
Ben Whaley

Un moyen facile à faire est de: -

aws s3api get-object --bucket bucket_name --key path/to/file.txt  --range bytes=0-10000 /path/to/local/t3.txt | cat t3 | head -100

Pour le fichier gz, vous pouvez faire 

aws s3api get-object --bucket bucket_name --key path/to/file.gz  --range bytes=0-10000 /path/to/local/t3 | zless t3 | head -100

Si les données sont en baisse, augmentez le nombre d'octets requis

0
Aklank Jain