如何读取一行来计算md5

时间:2015-08-12 03:00:20

标签: bash shell md5sum

我正在使用Linux bash版本4.1.2

我有一个制表符分隔的input_file有5个字段,我想计算每行的MD5,并将md5sum放在每行的末尾。

因此,期望的output_file应该每行有6个字段。

这是我的编码:

cat input_file | while read ONELINE
do
  THEMD5=`echo "$ONELINE" | md5sum | awk '{print $1}'`
  echo -e "${ONELINE}\t${THEMD5}"
done > output_file

编码在大多数情况下运作良好。

但是,如果ONELINE以单/双标签结束,则尾随标签将消失!

因此,由于缺少选项卡,output_file有时会包含4或5个字段的行。

我尝试在IFS=声明中添加IFS=''IFS=$'\n'IFS-$'\012'while,但仍然无法解决问题。

请帮忙。

Alvin SIU

1 个答案:

答案 0 :(得分:2)

如果您希望md5sums中包含尾随换行符(正如您的原始代码所示),以下内容肯定是正确的:

while IFS= read -r line; do
  read sum _ < <(printf '%s\n' "$line" | md5sum -)
  printf '%s\t%s\n' "$line" "$sum"
done <input_file

注意:

  • IFS中的字符被read剥离;设置IFS=足以防止这种影响。
  • 如果没有-r参数,read也会解释反斜杠文字,剥离它们。
  • 使用echo -e是危险的:它解释行内的转义序列,而不是将它们作为文字发出。
  • 使用全大写变量名称是不好的形式。请参阅the relevant spec(特别是第四段),请记住shell变量和环境变量共享一个命名空间。
  • 在处理不受控制的数据(特别是包含可以包含反斜杠文字的数据)时,一般使用echo是不好的形式。请参阅the relevant POSIX spec,特别是“应用程序使用和RATIONALE”部分。
  • 如果您想以隐藏字符可见的方式打印线条,请考虑使用'%q\t%s\n'代替'%s\t%s\n'作为格式字符串。