Wie md5 Hash-Ergebnis in Shell Pipe

12

Ich suche nach einer einfachen Möglichkeit, das Ergebnis von md5sumin einen anderen Befehl umzuleiten. Etwas wie das:

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

Mein Problem ist das md5sum nicht nur der Hash des Strings ausgegeben wird, sondern auch ein Bindestrich, der anzeigt, dass die Eingabe von stdin stammt. Ich habe die Man-Datei überprüft und keine Flags zur Steuerung der Ausgabe gefunden.

nmat
quelle
4
Hinweis: Achten Sie darauf, nicht zu verwenden, echo -nwenn die Textdaten unbekannt sind. Verwenden Sie printf '%s' "$DATA"stattdessen. Im Gegensatz dazu echo -n "$DATA"wird es funktionieren, wenn DATA="-n"(unter anderen Beispielen).
Stéphane Gimenez

Antworten:

14

Sie können den Befehl cut verwenden . Damit können Sie aus jeder Eingabezeile einen bestimmten Zeichen- / Byte-Bereich ausschneiden. Da der MD5-Hash eine feste Länge (32 Zeichen) hat, können Sie die Option verwenden -c 1-32, um nur die ersten 32 Zeichen der Eingabezeile beizubehalten:

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

Alternativ können Sie festlegen cut, dass die Zeile bei jedem Leerzeichen geteilt und nur das erste Feld ausgegeben werden soll: (Beachten Sie die Anführungszeichen um das Leerzeichen)

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

Weitere Optionen finden Sie auf der Hilfeseite zum Ausschneiden .

Riccardo Murri
quelle
Darüber habe ich auch nachgedacht! Ich wählte -d+ -fdamit md5sumkann ersetzt werden sha1sumspäter oder was auch immer.
Stéphane Gimenez
awkfunktioniert auch: echo -n test | md5sum | awk -F" " '{print $1}' oderawk -F" " '{print $1}' <(echo -n test | md5sum)
laebshade 16.08.11
Danke für die Antwort. @laebshade Eigentlich musst du printf verwenden, sonst wird am Ende ein neues
Zeilenzeichen
@laebshade: Die -F" "Option to awkist sehr seltsam anzusehen , da dies die Standardeinstellung für ist awk.
Enzotib
3

Sie können cutes:

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

Hier -d' 'wählt Raum als Trennzeichen, und -f1fragt nach dem ersten Feld (vor einem Begrenzungszeichen).

Stéphane Gimenez
quelle
2

Mit awk arbeitet zu fein:

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

Ein anderer Weg ist das Erstellen einer Teilzeichenfolge. Da Sie wissen, dass md5-Hash eine Zeichenfolge mit 32 Zeichen ist, können Sie Folgendes verwenden:

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

Es sind nur Saitenmanipulationen, Sie haben also die Wahl!

sdesvergez
quelle