如何读取一行来计算md5

how to read one line to calculate the md5

我正在使用 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 }'`
  echo -e "${ONELINE}\t${THEMD5}"
done > output_file

大部分时间编码工作正常。

但是,如果 ONELINE 以 single/double 个制表符结束,则尾随制表符将消失!

因此,由于缺少制表符,output_file 有时会包含 4 或 5 个字段的行。

我已经尝试在while语句中添加IFS=IFS=''IFS=$'\n'IFS-$'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,尤其是“应用程序使用”和“基本原理”部分。
  • 如果要以隐藏字符可见的方式打印行,请考虑使用 '%q\t%s\n' 而不是 '%s\t%s\n' 作为格式字符串。