Como canalizar o resultado do hash md5 no shell

12

Estou procurando uma maneira simples de canalizar o resultado de md5sumoutro comando. Algo assim:

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

Meu problema é que md5sumgera não apenas o hash da string, mas também um hypen, que indica que a entrada veio do stdin. Verifiquei o arquivo man e não encontrei nenhum sinalizador para controlar a saída.

nmat
fonte
4
Nota: tome cuidado para não usar echo -nquando os dados de texto forem desconhecidos. Use em printf '%s' "$DATA"vez disso. Ao contrário echo -n "$DATA", funcionará quando DATA="-n"(entre outros exemplos).
Stéphane Gimenez

Respostas:

14

Você pode usar o comando cut ; permite cortar um certo intervalo de caracteres / bytes de cada linha de entrada. Como o hash MD5 possui comprimento fixo (32 caracteres), você pode usar a opção -c 1-32para manter apenas os primeiros 32 caracteres da linha de entrada:

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

Como alternativa, você pode dizer cutpara dividir a linha em todos os espaços e gerar apenas o primeiro campo: (observe as aspas ao redor do caractere de espaço)

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

Veja a página de manual de corte para mais opções.

Riccardo Murri
fonte
Eu pensei sobre isso também! Eu escolhi -d+ -fpara que md5sumpossa ser substituído por sha1sumou mais tarde.
Stéphane Gimenez
awkfunciona também: echo -n test | md5sum | awk -F" " '{print $1}' ouawk -F" " '{print $1}' <(echo -n test | md5sum)
laebshade 16/08
Obrigado pela resposta. @laebshade Na verdade, você tem que usar printf caso contrário ele irá mostrar um novo caractere de linha no final;)
NMAT
@ laebshade: a -F" "opção para awké muito estranha de se ver, já que é o padrão awk.
enzotib 17/08/11
3

Você pode cut:

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

Aqui, -d' 'escolhe o espaço como delimitador e -f1solicita o primeiro campo (antes de um delimitador).

Stéphane Gimenez
fonte
2

Usar o awk também funciona bem:

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

Outra maneira é fazer uma substring. Como você sabe que o md5 hash é uma string com 32 caracteres, você pode usar:

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

São apenas manipulações de cordas, então você tem a escolha!

sdesvergez
fonte