在Linux上,我们通常使用head / tail命令来预览文件的内容。它有助于查看文件的一部分(例如检查格式),而不是打开整个文件。
在Amazon S3的情况下,似乎只有ls,cp,mv等.commands我想知道是否可以查看部分文件而无需使用cp / GET在本地计算机上下载整个文件。
从S3中检索数据时,可以指定字节范围,以获取前N个字节,最后N个字节或其间的任何内容。 (这也很有用,因为它允许您并行下载文件 - 只需启动多个线程或进程,每个线程或进程都会检索整个文件的一部分。)
我不知道哪种CLI工具直接支持这一点,但范围检索可以满足您的需求。
AWS CLI工具(确切地说是“aws s3 cp”)不允许你进行范围检索,但是s3curl(http://aws.amazon.com/code/128)应该这样做。(简单的卷曲,例如,使用--range参数,但你会必须自己签署请求。)
你可以做的一件事是将对象变为粗壮,然后将其传递到头部:
aws s3 cp s3://path/to/my/object - | head
最后你得到一个破损的管道错误,但它有效。
您可以使用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
的一个提示:如果它不工作尝试增加范围的大小。
如果您不想下载整个文件,可以使用--range
命令中指定的aws s3api
选项下载其中的一部分,并在下载文件部分后,然后对该文件运行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
中的指定大小下载到指定的输出文件。 &&
仅在第一个命令成功时才执行第二个命令。第二个命令打印先前创建的输出文件的第一行。
没有这样的能力。您只能检索整个对象。您可以执行HTTP HEAD request来查看对象元数据,但这不是您要查找的内容。
一个简单的方法是: -
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
如果数据较少,请增加所需的字节数
如果您使用的是s3cmd,则可以使用s3cmd get
并写入stdout并将其传递到head,如下所示:
s3cmd get s3://bucket/file | head
如果要查看gzip文件的头部,请将stdout传递给gzip -d -
并将其传递给head:
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 - | zcat -f | 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