"头"命令aws s3查看文件内容

时间:2014-09-22 22:01:15

标签: unix amazon-web-services amazon-s3

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

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

8 个答案:

答案 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