Команда "head" для aws s3 для просмотра содержимого файла

В Linux мы обычно используем команды head/tail для предварительного просмотра содержимого файла. Это помогает просматривать часть файла (для проверки формата), а не открывать весь файл.

В случае Amazon S3 кажется, что есть только ls, cp, mv и т.д. команды Я хотел знать, если это можно просмотреть часть файла без загрузки всего файла на моем локальном компьютере с помощью cp/GET.

Ответ 1

Вы можете указать диапазон байтов при извлечении данных из S3, чтобы получить первые N байтов, последние N байтов или все, что находится между ними. (Это также полезно, поскольку позволяет загружать файлы параллельно - просто запустите несколько потоков или процессов, каждый из которых извлекает часть общего файла.)

Я не знаю, какие из инструментов CLI поддерживают это напрямую, но поиск диапазона делает то, что вы хотите.

Инструменты AWI CLI ( "aws s3 cp", если быть точным) не позволяют вам выполнять поиск диапазона, но s3curl (http://aws.amazon.com/code/128) должен сделать трюк. (Таким образом, обычный скручивание, например, с использованием параметра --range, но тогда вам придется выполнять подписку на запрос самостоятельно.)

Ответ 2

Одна вещь, которую вы можете сделать, это cp объект для толстого, а затем передать его в голову:

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

В конце вы получаете сообщение об ошибке прерывания, но оно работает.

Ответ 3

Вы можете использовать переключатель 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 из указанной папки bucket и s3 с указанным размером в --range к указанному выходному файлу. && выполняет вторую команду только в том случае, если первая выполнена успешно. Вторая команда печатает 10 первых строк ранее созданного выходного файла.

Ответ 5

Нет такой возможности. Вы можете получить только весь объект. Вы можете выполнить HTTP HEAD request для просмотра метаданных объекта, но это не то, что вы ищете.

Ответ 6

Один простой способ сделать это:

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

Если данных меньше, увеличьте количество требуемых байтов

Ответ 7

Если вы используете s3cmd, вы можете использовать s3cmd get и write для stdout и направить его в head следующим образом:

s3cmd get s3://bucket/file | head

Если вы хотите просмотреть gzip -d - gzip файла, gzip -d - в gzip -d - и в 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 - | zcat -f | head -n $NUM_LINES
}

Теперь ~/.bashrc файл ~/.bashrc. Просто запустив s3head s3://bucket/file, вы получите первые 10 строк вашего файла. Если вы хотите больше строк, просто укажите -n и количество строк следующим образом:

# Prints the first 14 lines of s3://bucket/file
s3head -n 14 s3://bucket/file