Команда "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