Jak potokować potok MD5 w powłoce

12

Szukam prostego sposobu na przekazanie wyniku md5sumdo innego polecenia. Coś takiego:

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

Mój problem polega na tym, że md5sumgeneruje nie tylko skrót ciągu, ale także myślnik, który wskazuje, że dane wejściowe pochodziły ze standardowego wejścia. Sprawdziłem plik man i nie znalazłem żadnych flag kontrolujących dane wyjściowe.

nmat
źródło
4
Uwaga: należy zachować ostrożność, aby nie używać, echo -ngdy dane tekstowe są nieznane. Użyj printf '%s' "$DATA"zamiast tego. W przeciwieństwie do echo -n "$DATA"tego będzie działać, gdy DATA="-n"(między innymi).
Stéphane Gimenez

Odpowiedzi:

14

Możesz użyć polecenia cut ; pozwala wyciąć określony zakres znaków / bajtów z każdej linii wejściowej. Ponieważ skrót MD5 ma stałą długość (32 znaki), możesz użyć opcji, -c 1-32aby zachować tylko pierwsze 32 znaki z wiersza wprowadzania:

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

Alternatywnie możesz powiedzieć, cutaby podzielić linię na każdym spacji i wypisać tylko pierwsze pole: (zwróć uwagę na cudzysłowy wokół znaku spacji)

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

Więcej informacji znajdziesz na stronie cięcia .

Riccardo Murri
źródło
Też o tym myślałem! Wybrałem -d+ -f, aby md5summożna go było zastąpić sha1sumdowolnym innym.
Stéphane Gimenez
awkdziała również: echo -n test | md5sum | awk -F" " '{print $1}' lubawk -F" " '{print $1}' <(echo -n test | md5sum)
laebshade
Dziękuję za Twoją odpowiedź. @laebshade Właściwie musisz użyć printf, w przeciwnym razie na końcu pojawi się nowy znak wiersza;)
nmat
@laebshade: -F" "opcja awkjest bardzo dziwna, biorąc pod uwagę, że jest ona domyślna dla awk.
enzotib
3

Możesz cutto:

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

Tutaj -d' 'wybiera spację jako separator i -f1prosi o pierwsze pole (przed separatorem).

Stéphane Gimenez
źródło
2

Korzystanie z awk również działa dobrze:

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

Innym sposobem jest utworzenie podłańcucha. Ponieważ wiesz, że skrót md5 jest ciągiem zawierającym 32 znaki, możesz użyć:

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

To tylko manipulacje sznurkiem, więc masz wybór!

sdesvergez
źródło