2011-05-04 13 views
8

मैं एक छोटी सी स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो एक टेक्स्ट फ़ाइल खोल देगा और मुझे प्रत्येक पंक्ति के लिए एमडी 5 हैश देगी।हैश टेक्स्ट फ़ाइल में प्रत्येक पंक्ति

123 
213 
312 

मैं उत्पादन होना चाहते हैं: उदाहरण के लिए: मैं के साथ एक फ़ाइल है

ba1f2511fc30423bdbb183fe33f3dd0f 
6f36dfd82a1b64f668d9957ad81199ff 
390d29f732f024a4ebd58645781dfa5a 

मैं जो प्रत्येक पंक्ति पढ़ा जाएगा बैश में इस हिस्से करने के लिए कोशिश कर रहा हूँ:

#!/bin/bash 
#read.file.line.by.line.sh 

while read line 
do 
echo $line 
done 

मैं पर बाद में कार्य करें:

$ more 123.txt | ./read.line.by.line.sh | md5sum | cut -d ' ' -f 1 

लेकिन मैं मील कर रहा हूँ यहाँ कुछ ssing, काम नहीं करता है :(

हो सकता है कि वहाँ एक आसान तरीका है ...

उत्तर

4

तुम बस लिपि में सीधे md5sum कॉल कर सकते हैं:

#!/bin/bash 
#read.file.line.by.line.sh 

while read line 
do 
echo $line | md5sum | awk '{print $1}' 
done 

इस तरह स्क्रिप्ट सीधे बाहर थूक आप क्या चाहते हैं: प्रत्येक पंक्ति का md5 हैश।

+4

आपको प्रत्येक लाइन के लिए अनावश्यक उदाहरण को रोकने से बचने के लिए शायद अजीब बाहरी लूप डालना चाहिए। बस करो 'करो अजीब '{प्रिंट $ 1}' '। –

+2

आपको echo -n $ line करना चाहिए क्योंकि डिफ़ॉल्ट रूप से, इको स्ट्रिंग के अंत में एक नई पंक्ति जोड़ता है। नतीजतन, यह स्ट्रिंग के MD5 मान को बदलता है। –

+0

उनके उदाहरण में हैश में नई लाइन शामिल है ... मैंने मूल्यों की जांच की। –

17
लगभग हो गया है

, इस प्रयास करें:

while read -r line; do printf %s "$line" | md5sum | cut -f1 -d' '; done < 123.txt 

जब तक आप भी हर पंक्ति में न्यू लाइन चरित्र हैश करने के लिए चाहते हैं आप echo विकल्प के बजाय printf या echo -n उपयोग करना चाहिए।

एक स्क्रिप्ट में:

#! /bin/bash 
cat "[email protected]" | while read -r line; do 
    printf %s "$line" | md5sum | cut -f1 -d' ' 
done 

स्क्रिप्ट पैरामीटर के रूप में एकाधिक फ़ाइलों के साथ कहा जा सकता है।

+2

या स्ट्रिंग को "echo" के बिना md5 के stdin पर पास करें: md5 <<< "$ line" –

+4

@glenn जैकमैन आपका उदाहरण प्रत्येक पंक्ति का नया रूप भी है जो स्ट्रिंग के हैश को बदलता है। –

संबंधित मुद्दे