我使用的是 macOS Sierra,想要对文件中的每一行进行 sha256。
文件:
test
example
sample
预期输出:
9F86D081884C7D659A2FEAA0C55AD015A3BF4F1B2B0B822CD15D6C15B0F00A08
50D858E0985ECC7F60418AAF0CC5AB587F42C2570A884095A9E8CCACD0F6545C
AF2BDBE1AA9B6EC1E2ADE1D694F41FC71A831D0268E9891562113D8A62ADD1BF
我在Ubuntu上找到了一些方法来做到这一点,但Mac上似乎没有安装sha256。听起来,您必须使用类似于
shasum 256
的东西,但似乎没有任何效果。
openssl dgst
在 MacOS 上开箱即用(也几乎在其他任何地方),并且可以轻松地与 BashFAQ #1 逐行迭代的实践结合使用:
### INEFFICIENT SOLUTION
hashlines() {
while IFS= read -r line; do
printf '%s' "$line" \
| openssl dgst -sha256 \
| tr '[[:lower:]]' '[[:upper:]]' \
| sed -Ee 's/.*=[[:space:]]//'
done
}
也就是说,在大文件上运行时效率非常低。如果您需要性能良好的东西,我会用 Python 编写。包装在相同的 shell 函数中,具有相同的调用约定,可能看起来像:
### FAST SOLUTION
hashlines ()
{
python3 -c '
import sys, hashlib
for line in sys.stdin:
print(hashlib.sha256(line.encode().rstrip(b"\n")).hexdigest().upper())'
}
无论哪种情况,用法都只是
hashlines < filename
或 hashlines <<< $'line one\nline two'
。