Làm thế nào để sử dụng AWS S3 CLI để kết xuất tệp sang stdout trong BASH?


93

Tôi đang bắt đầu một tập lệnh bash sẽ lấy một đường dẫn trong S3 (như được chỉ định cho lệnh ls ) và kết xuất nội dung của tất cả các đối tượng tệp vào stdout. Về cơ bản, tôi muốn sao chép cat /path/to/files/*ngoại trừ S3, ví dụ s3cat '/bucket/path/to/files/*'. Xu hướng đầu tiên của tôi khi xem xét các tùy chọn là sử dụng cplệnh cho một tệp tạm thời và sau đó catlà lệnh đó.

Có ai đã thử điều này hoặc tương tự hoặc đã có một lệnh mà tôi không tìm thấy nó không?


Tôi sử dụng PHP và lớp Services_Amazon_S3 để làm những việc tương tự.
Bị hiểu nhầm

Câu trả lời:


152

kết xuất nội dung của tất cả các đối tượng tệp sang stdout.

Bạn có thể thực hiện điều này nếu bạn vượt qua -đích đến của aws s3 cplệnh. Ví dụ $ aws s3 cp s3://mybucket/stream.txt -,.

Những gì bạn đang cố gắng làm là một cái gì đó như thế này? ::

#!/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
Tuy nhiên, lưu ý rằng '-' làm trình giữ chỗ cho stdout không hoạt động trong tất cả các phiên bản của awscli. Ví dụ: phiên bản 1.2.9, đi kèm với ubuntu LTS 14.04.2, không hỗ trợ nó.
antoniob

Ditto đó. Tôi đang sử dụng Ubuntu 12.x và nó không hoạt động trong trường hợp bash của tôi.
Kode Charlie

Vấn đề với điều này là bạn không thể tải xuống phiên bản cụ thể của tệp.
Eamorr

không làm việc trên hệ điều hành MacOS High Sierra 10.13.6 hoặc ( aws --version: aws-cli/1.15.40 Python/3.6.5 Darwin/17.7.0 botocore/1.10.40)
MichaelChirico

câu trả lời này cũng có lợi thế là nội dung tệp sẽ được truyền trực tuyến đến thiết bị đầu cuối của bạn và không được sao chép toàn bộ. xem thêm tại loige.co/aws-command-line-s3-content-from-stdin-or-to-stdout/…
Khoa

47

Nếu bạn đang sử dụng phiên bản AWS CLI không hỗ trợ sao chép sang "-", bạn cũng có thể sử dụng / dev / stdout:

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

Bạn cũng có thể muốn --quietcờ ngăn dòng tóm tắt như sau được nối vào đầu ra của bạn:

tải xuống: s3: //mybucket/stream.txt tới ../../dev/stdout


1

Bạn có thể thử sử dụng s3streamcat , nó cũng hỗ trợ các định dạng bzip, gzip và xz.

Cài đặt với

sudo pip install s3streamcat

Sử dụng:

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


-3

Nếu bạn muốn thực hiện điều này bằng BASH, bạn sẽ phải gọi ra một ứng dụng bên ngoài như Giao diện dòng lệnh AWS (CLI). Nó không có CAT tương đương, vì vậy bạn sẽ cần sao chép tệp cục bộ và sau đó CAT nó.

Ngoài ra, bạn có thể sử dụng / viết một ứng dụng gọi trực tiếp AWS SDK, có sẵn cho các ngôn ngữ như Python, PHP, Java. Bằng cách sử dụng SDK, nội dung tệp có thể được truy xuất trong bộ nhớ và sau đó được gửi đến stdout.


Câu trả lời trên liệt kê rằng bạn có thể sử dụng 'cp' với '-' làm đối số tệp thứ 2 để làm cho nó xuất tệp ra stdout.
Asfand Qazi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.