Cara pipa hash hasil md5 di shell

12

Saya mencari cara sederhana untuk menyalurkan hasil md5sumke perintah lain. Sesuatu seperti ini:

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

Masalah saya adalah bahwa md5sumoutput tidak hanya hash dari string, tetapi juga sebuah tanda hubung, yang menunjukkan bahwa input berasal dari stdin. Saya memeriksa file man dan saya tidak menemukan flag untuk mengontrol output.

nmat
sumber
4
Catatan: berhati-hatilah agar tidak digunakan echo -nsaat data teks tidak dikenal. Gunakan printf '%s' "$DATA"sebagai gantinya. Tidak seperti echo -n "$DATA"itu, itu akan berfungsi ketika DATA="-n"(antara contoh lainnya).
Stéphane Gimenez

Jawaban:

14

Anda dapat menggunakan potongan perintah ; ini memungkinkan Anda untuk memotong rentang karakter / byte tertentu dari setiap jalur input. Karena hash MD5 memiliki panjang tetap (32 karakter), Anda dapat menggunakan opsi -c 1-32untuk menyimpan hanya 32 karakter pertama dari baris input:

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

Atau, Anda dapat memberitahu cutuntuk membagi garis di setiap ruang dan hanya menghasilkan bidang pertama: (perhatikan tanda kutip di sekitar karakter spasi)

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

Lihat halaman manual cut untuk lebih banyak opsi.

Riccardo Murri
sumber
Saya juga memikirkan hal itu! Saya memilih -d+ -fsehingga md5sumdapat diganti dengan sha1sumatau apa pun nanti.
Stéphane Gimenez
awkberfungsi juga: echo -n test | md5sum | awk -F" " '{print $1}' atauawk -F" " '{print $1}' <(echo -n test | md5sum)
laebshade
Terima kasih atas jawabannya. @laebshade Sebenarnya, Anda harus menggunakan printf jika tidak akan menghasilkan karakter baris baru di akhir;)
nmat
@laebshade: -F" "opsi untuk awksangat aneh untuk dilihat, mengingat bahwa itu adalah default untuk awk.
enzotib
3

Anda bisa cut:

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

Di sini, -d' 'pilih ruang sebagai pembatas, dan -f1meminta bidang pertama (sebelum pembatas).

Stéphane Gimenez
sumber
2

Menggunakan awk juga berfungsi dengan baik:

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

Cara lain adalah membuat substring. Karena Anda tahu md5 hash adalah string dengan 32 karakter, Anda dapat menggunakan:

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

Itu hanya manipulasi string, jadi Anda punya pilihan!

sdesvergez
sumber