2011-05-04 53 views
8

我正在尝试编写一个脚本,它将打开一个文本文件并为每行文本提供一个md5散列。比如我有一个文件:散列文本文件中的每一行

123 
213 
312 

我想输出是:

ba1f2511fc30423bdbb183fe33f3dd0f 
6f36dfd82a1b64f668d9957ad81199ff 
390d29f732f024a4ebd58645781dfa5a 

我试图做这部分在bash这将读取每一行:

#!/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 

但我是mi这里ssing的东西,不工作:(

也许还有一个更简单的方法...

回答

4

您只需调用的md5sum直接在脚本:

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

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

这样的脚本直接吐出来你想要什么:每行的md5散列。

+4

您应该将awk置于外部循环中,以避免为每行产生一个不必要的实例。只要做'完成| awk'{print $ 1}''。 – 2011-05-04 21:43:59

+2

您应该执行echo -n $行,因为默认情况下,echo会在字符串的末尾添加一个换行符。因此,它会更改字符串的MD5值。 – 2011-05-05 07:25:14

+0

他的例子包括散列中的换行符...我检查了值。 – 2011-05-05 13:56:50

17

快到了,试试这个:

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

除非你也想凑在每行换行字符,你应该使用printfecho -n,而不是echo选项。

在脚本:

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

该脚本可以使用多个文件作为参数来调用。

+2

或者将字符串传递给md5的标准输入,而不使用“echo”:md5 <<<“$ line” – 2011-05-04 23:43:28

+4

@glenn jackman您的示例还会散列每行的换行符,它会更改字符串的散列。 – 2011-05-05 08:10:57