【问题标题】:How to use `md5sum` to process `$1` of `awk`?如何使用`md5sum`处理`awk`的`$1`?
【发布时间】:2021-07-05 11:14:37
【问题描述】:

test 文件为例:

cat <<'EOF'> test
/boot/efi/EFI/debian/grubx64.efi root root 700 1625230722
/boot/efi/EFI/debian/mmx64.efi root root 700 1625230722
/boot/efi/EFI/debian/shimx64.efi root root 700 1625230722
/boot/grub/fonts/unicode.pf2 root root 644 1625230723
EOF

我打算在test文件中再增加一列,新增列的值取决于第一列(md5sum --binary($1)),如md5sum --binary /boot/efi/EFI/debian/grubx64.efi

我的脚本是awk '{ cmd = "md5sum --binary" close(cmd) $(NF+1) = (cmd($1)); print }' test &gt; test_new,但出现如下错误:

awk: line 1: syntax error at or near =

我是awk的新手,有什么问题?

【问题讨论】:

  • awk 中的语句必须用分号或换行符分隔。 'close` 语句之前没有语句分隔符,之后也没有。
  • @user1934428:这不是唯一的问题。
  • @anubhava :这是语法错误的问题。如果您在close(cmd) 之后放置一个分号,this 语法错误就会消失。这并不意味着脚本在之后可以工作,但是对于这方面,您已经发布了一个很好的答案。我只是想回答OP的字面问题,因为她也想知道这个错误信息的原因。
  • @rowboat,$1 引用的文件的校验和。
  • md5sum 是一个命令。 awk 是一个操作文本的工具,而不是一个排序命令调用的工具。 shell 是一种对命令调用进行排序的工具。当您尝试为此使用 awk 时,您实际上是在进行一系列调用 shell { awk { shell { md5sum } } } 在每个输入行生成一个新的子 shell 来调用 md5sum,而如果您只是从 shell 调用 md5sum 那么它只是 shell { md5sum },即 1 个 shell 调用每个输入行一次 md5sum,这样会更快更简单。

标签: awk md5sum


【解决方案1】:

这个awk 应该可以工作:

awk '{cmd = "md5sum --binary \047" $1 "\047"; 
if ((cmd | getline out) > 0) print $0, out; close(cmd)}' file.test

但是对于这样的任务,bash 循环应该会做得更好,因为我们只使用第一列来调用外部程序:

while read -r col1 rest; do
   echo "$col1 $rest" "$(md5sum --binary "$col1")"
done < file.test

【讨论】:

  • 谢谢。我应该在 awk 中添加语句分隔符吗?
  • 我尝试了第二种方法并重定向到new文件,但得到错误:while read -r col1 rest; do echo "$col1 $rest" "$(md5sum --binary &lt;&lt;&lt; "$col1")" &gt; file.test.new done &lt; file.test
  • bash --version GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu) still got above error.
  • sudo... 导致错误,sudo bash ... 解决问题。
  • 感谢 Ed 富有洞察力的 cmets。我已根据您的建议修改了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多