【问题标题】:how to read one line to calculate the md5如何读取一行来计算md5
【发布时间】:2015-08-12 03:00:19
【问题描述】:

我使用的是 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 以单/双制表符结尾,则尾随制表符将消失!

因此,由于缺少选项卡,输出文件有时会包含 4 或 5 行字段。

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

请帮忙。

萧亚文

【问题讨论】:

  • 如果您有问题没有解决,您需要提供一个 SSCCE 来演示它——在这种情况下,修改您的脚本以生成它自己的输入就足够了。例如:< <(printf 'hello\nhello\t\t\n') -- 如果这两行的 md5sum 不同,就会清楚地证明这个错误。
  • 查看ideone.com/UqYj7R 了解完整 MCVE 的示例,包括(工作!)输入数据。

标签: bash shell md5sum


【解决方案1】:

如果您想在 md5sum 中包含尾随换行符(就像您的原始代码一样),以下内容肯定是正确的:

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' 作为格式字符串。

【讨论】:

  • 谢谢查尔斯!该代码有效。我的 bash 不能使用 [[[ read sum ]]] 语句。我必须使用语句 [[[ read sum _
  • @AlvinSIU,您运行的是哪个版本的 bash?此处的所有内容都通过 3.x 系列得到支持。
  • @AlvinSIU, ...因此,只要您的 shell 真的是 bash(而不是 /bin/sh),我预计会出现拼写错误或转录错误比真正的不兼容更有可能。你复制粘贴了吗?
  • @AlvinSIU, ...如果您做了复制并粘贴并出现错误,请检查您使用的是#!/bin/bash而不是#!/bin/sh,或者bash scriptname 而不是 sh scriptname
  • @AlvinSIU, ...假设,也就是说,你在一个真正的 UNIX 平台上并且没有使用 Git Bash——如果是后者,我建议升级当前版本之一(来自 msysgit.github.io),它们不再基于古老的、有缺陷的 mingw 构建。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 2016-06-16
  • 2011-03-01
  • 2018-11-25
  • 2011-01-06
  • 2021-01-19
相关资源
最近更新 更多