Как передать md5 хэш результат в оболочку

12

Я ищу простой способ передать результат md5sumв другую команду. Что-то вроде этого:

$echo -n 'test' | md5sum | ...

Моя проблема заключается в том, что md5sumвыводит не только хэш строки, но также и перенос, который указывает на то, что ввод поступил из стандартного ввода. Я проверил файл man и не нашел никаких флагов для контроля вывода.

NMAT
источник
4
Примечание: будьте осторожны, чтобы не использовать, echo -nкогда текстовые данные неизвестны. Используйте printf '%s' "$DATA"вместо этого. В отличие от этого echo -n "$DATA", он будет работать, когда DATA="-n"(среди других примеров).
Стефан Гименес

Ответы:

14

Вы можете использовать команду вырезать ; это позволяет вам вырезать определенный диапазон символов / байтов из каждой строки ввода. Поскольку хэш MD5 имеет фиксированную длину (32 символа), вы можете использовать опцию, -c 1-32чтобы сохранить только первые 32 символа из строки ввода:

echo -n test | md5sum | cut -c 1-32

В качестве альтернативы вы можете указать cutразделить строку в каждом пробеле и вывести только первое поле: (обратите внимание на кавычки вокруг символа пробела)

echo -n test | md5sum | cut -d " " -f 1

Смотрите раздел man для дополнительной информации.

Риккардо Мурри
источник
Я тоже об этом думал! Я выбрал -d+, -fчтобы его md5sumможно было заменить на sha1sumили как угодно позже.
Стефан Гименес
awkтоже работает: echo -n test | md5sum | awk -F" " '{print $1}' илиawk -F" " '{print $1}' <(echo -n test | md5sum)
laebshade
Спасибо за ответ. @laebshade На самом деле, вы должны использовать printf, иначе он будет выводить символ новой строки в конце;)
nmat
@laebshade: -F" "опция awkочень странная, учитывая, что она используется по умолчанию awk.
энзотиб
3

Вы можете cutэто:

echo -n 'test' | md5sum | cut -d' ' -f1

Здесь -d' 'выбирает пробел в качестве разделителя и -f1запрашивает первое поле (перед разделителем).

Стефан Хименес
источник
2

Использование awk тоже отлично работает:

echo -n 'test' | md5sum | awk '{print $1}'

Другой способ сделать подстроку. Поскольку вы знаете, что md5-хеш - это строка из 32 символов, вы можете использовать:

HASH=$(echo -n 'test' | md5sum -) && echo ${HASH:0:32}

Это просто струнные манипуляции, так что у вас есть выбор!

sdesvergez
источник