在Linux上,我们通常使用head / tail命令来预览文件的内容。它有助于查看文件的一部分(例如检查格式),而不是打开整个文件。
对于Amazon S3,似乎只有ls,cp,mv等commands我想知道是否可以查看部分文件而无需在本地下载整个文件机器使用cp / GET。
答案 0 :(得分:43)
你可以做的一件事是将对象变为粗壮,然后将其传递到头部:
aws s3 cp s3://path/to/my/object - | head
你最后得到一个破损的管道错误,但它有效。
答案 1 :(得分:8)
您可以使用range
切换到较旧的s3api get-object
命令来恢复s3对象的第一个字节。 (AFAICT s3
不支持切换。)
如果您只想通过管道到\dev\stdout
来查看S3对象,则可以将管道head
作为目标文件名传递。这是一个例子:
aws s3api get-object --bucket mybucket_name --key path/to/the/file.log --range bytes=0-10000 /dev/stdout | head
最后,如果像我一样处理压缩的.gz
文件,上述技术也适用于zless
,使您能够查看解压缩文件的头部:
aws s3api get-object --bucket mybucket_name --key path/to/the/file.log.gz --range bytes=0-10000 /dev/stdout | zless
zless
的一个提示:如果它不起作用,请尝试增加范围的大小。
答案 2 :(得分:6)
您可以在从S3检索数据时指定字节范围,以获取前N个字节,最后N个字节或其间的任何内容。 (这也很有用,因为它允许您并行下载文件 - 只需启动多个线程或进程,每个线程或进程都会检索整个文件的一部分。)
我不知道哪种CLI工具直接支持这种方法,但范围检索可以满足您的需求。
AWS CLI工具(准确地称为“aws s3 cp”)不允许您进行范围检索,但s3curl(http://aws.amazon.com/code/128)应该可以解决这个问题。(例如,使用 - -range参数但是你必须自己进行请求签名。)
答案 3 :(得分:4)
如果您不想下载整个文件,可以使用aws s3api
命令中指定的--range
选项下载其中的一部分,然后在下载文件部分后,在该文件上运行head
命令。
示例:
aws s3api get-object --bucket my_s3_bucket --key s3_folder/file.txt --range bytes=0-1000000 tmp_file.txt && head tmp_file.txt
说明:
aws s3api get-object
将指定存储区和s3文件夹中的一部分s3文件从--range
中指定的大小下载到指定的输出文件。
仅当第一个命令成功时,&&
才执行第二个命令。
第二个命令打印先前创建的输出文件的第一行。
答案 4 :(得分:0)
没有这样的能力。您只能检索整个对象。您可以执行HTTP HEAD request来查看对象元数据,但这不是您要查找的内容。
答案 5 :(得分:0)
一个简单的方法是: -
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
对于gz文件,您可以执行
aws s3api get-object --bucket bucket_name --key path/to/file.gz --range bytes=0-10000 /path/to/local/t3 | zless t3 | head -100
如果数据较少,则需要增加所需的字节数
答案 6 :(得分:0)
如果使用的是s3cmd,则可以使用s3cmd get
并写入stdout并将其通过管道传递到head,如下所示:
s3cmd get s3://bucket/file | head
如果要查看gzip文件的头部,请将stdout传递到gzip -d -
并指向:
s3cmd get s3://bucket/file | gzip -d - | head
如果您对管道业务不满意,请将以下脚本添加到~/.bashrc
function s3head() {
NUM_LINES=10
while test $# -gt 0; do
case $1 in
-h|--help)
echo "s3head [-n NUM] <S3_FILE_PATH>"
return
;;
-n)
shift
if test $# -gt 0; then
export NUM_LINES=$1
else
echo "Number of lines not specified"
return
fi
shift
;;
*)
break
;;
esac
done
if [[ -z "$1" ]]; then
echo "S3 file path is not specified"
return
fi
s3cmd get $1 - | gzip -d - | head -n $NUM_LINES
}
现在源~/.bashrc
文件。
只需运行s3head s3://bucket/file
,您就会获得文件的前10行。
如果需要更多行,只需指定-n,然后指定行数,如下所示:
# Prints the first 14 lines of s3://bucket/file
s3head -n 14 s3://bucket/file
答案 7 :(得分:0)
正如其他人回答的那样,假设文件很大,请在get-object
中使用--range bytes=0-1000
命令,仅下载文件的一部分。
示例:
aws s3api get-object --profile opsrep --region eu-west-1 --bucket <MY-BUCKET> --key <DIR/MY-FILE.CSV> --range bytes=0-10000 "OUTPUT.csv"
docs
自2018年起,您现在可以运行SELECT Queries in AWS CLI。使用 LIMIT 10 预览文件的“头”。
示例:
aws s3api select-object-content --bucket <MY-BUCKET> --key <DIR/MY-FILE.CSV> --expression "select * from s3object limit 10" --expression-type "SQL" --input-serialization "CSV={}" --output-serialization "CSV={}" "OUTPUT.csv"
docs
现在您可以在小型本地文件上快速运行head OUTPUT.csv