如何读取一行来计算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'
作为格式字符串。
我正在使用 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'
作为格式字符串。