【问题标题】:command 'md5sum' without '-'token at the end命令 'md5sum' 最后没有 '-' 标记
【发布时间】:2017-05-11 20:10:30
【问题描述】:

我想用 md5 在一个新的单独文本文件中散列文本文件的内容。这适用于每一行。我为此编写了以下 bash 脚本

#!/bin/bash
while read line; do echo -n $line|md5sum; done < $1 > $1.hash

这很好用。但是随着

echo -n 'somewords' | md5sum 

我的输出是这样的8bf1072ac725ca3bc7f532079dd973ba - 我希望我的输出没有 - 最后。所以我的脚本应该给我这样的东西:

hash 1
hash 2
hash 3

而不是

hash 1  -
hash 2  -
hash 3  -

【问题讨论】:

  • 只需通过cut:while IFS= read -r line; do printf '%s' "$line" | md5sum; done &lt; "$1" | cut -d' ' -f1 &gt; "$1.hash"。或awk。为提高效率,将cut/awk/whatever 放在 done 关键字之后,就像我向您展示的那样。并使用更多的引号。并使用printf 而不是echo -n
  • 很好,工作正常。还要感谢 printf 的提示。

标签: linux bash hash command-line md5


【解决方案1】:

由于 md5 哈希值正好是 32 字节长,所以在此处删减行:

while read line; do echo -n "$line"|md5sum; done < $1 |cut -c1-32 > $1.hash

【讨论】:

    【解决方案2】:

    您可以通过grep 过滤输出,例如

    printf somewords | md5sum | grep -o '^\S\+'
    

    所以脚本是:

    #!/usr/bin/env bash
    while read line; do
      printf "%s" $line | md5sum;
    done < "$1" | grep -o '^\S\+' > "$1".hash
    

    【讨论】:

      【解决方案3】:

      我很惊讶没有人回答 awk

      echo "abc" | md5sum | awk -F "-" '{print $1}'
      

      对于您的示例,它看起来像这样

      while read line
      do 
          echo -n "$line" | md5sum; 
      done < $1 |awk -F "-" '{print $1}' > $1.hash
      

      【讨论】:

      • 其实你知道的。根据定义,MD5 和的长度为 128 位(32 个十六进制字符)。
      • 我的立场是正确的。我会更新我的答案。谢谢解释
      猜你喜欢
      • 2018-10-28
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 2022-06-16
      • 1970-01-01
      相关资源
      最近更新 更多