用于aws s3查看文件内容的“head”命令

问题描述 投票:17回答:7

在Linux上,我们通常使用head / tail命令来预览文件的内容。它有助于查看文件的一部分(例如检查格式),而不是打开整个文件。

在Amazon S3的情况下,似乎只有ls,cp,mv等.commands我想知道是否可以查看部分文件而无需使用cp / GET在本地计算机上下载整个文件。

unix amazon-web-services amazon-s3
7个回答
6
投票

从S3中检索数据时,可以指定字节范围,以获取前N个字节,最后N个字节或其间的任何内容。 (这也很有用,因为它允许您并行下载文件 - 只需启动多个线程或进程,每个线程或进程都会检索整个文件的一部分。)

我不知道哪种CLI工具直接支持这一点,但范围检索可以满足您的需求。

AWS CLI工具(确切地说是“aws s3 cp”)不允许你进行范围检索,但是s3curl(http://aws.amazon.com/code/128)应该这样做。(简单的卷曲,例如,使用--range参数,但你会必须自己签署请求。)


46
投票

你可以做的一件事是将对象变为粗壮,然后将其传递到头部:

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

最后你得到一个破损的管道错误,但它有效。


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的一个提示:如果它不工作尝试增加范围的大小。


4
投票

如果您不想下载整个文件,可以使用--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中的指定大小下载到指定的输出文件。 &&仅在第一个命令成功时才执行第二个命令。第二个命令打印先前创建的输出文件的第一行。


0
投票

没有这样的能力。您只能检索整个对象。您可以执行HTTP HEAD request来查看对象元数据,但这不是您要查找的内容。


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

如果数据较少,请增加所需的字节数


0
投票

如果您使用的是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
© www.soinside.com 2019 - 2024. All rights reserved.