Cómo canalizar el resultado hash md5 en shell

12

Estoy buscando una forma simple de canalizar el resultado de md5sumotro comando. Algo como esto:

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

Mi problema es que md5sumno solo genera el hash de la cadena, sino también una exageración, lo que indica que la entrada provino de stdin. Revisé el archivo man y no encontré ningún indicador para controlar la salida.

nmat
fuente
44
Nota: tenga cuidado de no usar echo -ncuando se desconocen los datos de texto. Usar en su printf '%s' "$DATA"lugar. A diferencia echo -n "$DATA", funcionará cuando DATA="-n"(entre otros ejemplos).
Stéphane Gimenez

Respuestas:

14

Puedes usar el comando cortar ; le permite cortar un cierto rango de caracteres / bytes de cada línea de entrada. Como el hash MD5 tiene una longitud fija (32 caracteres), puede usar la opción -c 1-32para mantener solo los primeros 32 caracteres de la línea de entrada:

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

Alternativamente, puede indicar cutdividir la línea en cada espacio y mostrar solo el primer campo: (tenga en cuenta las comillas alrededor del espacio)

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

Vea la página de manual de corte para más opciones.

Riccardo Murri
fuente
¡Pensé en eso también! Elegí -d+ -fpara que md5sumpueda ser reemplazado con sha1sumo lo que sea más tarde.
Stéphane Gimenez
awktambién funciona: echo -n test | md5sum | awk -F" " '{print $1}' oawk -F" " '{print $1}' <(echo -n test | md5sum)
laebshade
Gracias por la respuesta. @laebshade En realidad, debe usar printf; de lo contrario, generará un nuevo carácter de línea al final;)
nmat
@laebshade: la -F" "opción para awkes muy extraña de ver, dado que es la opción predeterminada para awk.
enzotib
3

Puedes cuthacerlo:

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

Aquí, -d' 'elige el espacio como delimitador y -f1solicita el primer campo (antes de un delimitador).

Stéphane Gimenez
fuente
2

Usar awk también funciona bien:

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

Otra forma es hacer una subcadena. Como sabe que el hash md5 es una cadena con 32 caracteres, puede usar:

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

Son solo manipulaciones de cuerdas, ¡así que tienes la opción!

sdesvergez
fuente