Bash awk中的Base64实用程序

Bash awk中的Base64实用程序,bash,awk,Bash,Awk,在尝试使用awk将带有0xFFD8 jpeg签名的图像二进制文件转换为base64字符串时,我遇到了一个特定的问题。在我看来,我就快到了,但是base64字符串被截断了,并且不完整。由于图像二进制文件很大,我不确定这是否会导致问题。生成此命令的命令如下所示: #!/bin/bash awk --field-separator '|' '{ "echo "$mybinaryhere" | xxd -r -p | base64" | getline x print x }' myfile.csv

在尝试使用awk将带有0xFFD8 jpeg签名的图像二进制文件转换为base64字符串时,我遇到了一个特定的问题。在我看来,我就快到了,但是base64字符串被截断了,并且不完整。由于图像二进制文件很大,我不确定这是否会导致问题。生成此命令的命令如下所示:

#!/bin/bash
awk --field-separator '|' '{ "echo "$mybinaryhere" | xxd -r -p | base64" | getline x print x }' myfile.csv
输出为:

/9j/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMU
预期的输出应该类似,但要长得多,因为它是一个二进制图像。$mybinaryhere只是一个列变量,它在awk读取myfile.csv时保存完整的二进制图像


感谢您,gawk和其他版本的awk对通过管道传输到getline的命令字符串的长度有限制

例如,在ubuntu设备上,我得到:

bash$ for a in gawk 'busybox awk'; do
  for x in 131059 131060; do
      echo "$a :"
      perl -e 'print "." x '$x',"\n"' |\
      $a '{
        y=$1
        print length($1)+length("echo |md5sum")
        "echo "y"|md5sum" | getline z
        print z
      }'
  done
done
gawk :
131071
3ee42da12241d3e96a1513588bf50daf  -
gawk :
131072

busybox awk :
131071
3ee42da12241d3e96a1513588bf50daf  -
busybox awk :
131072

$
在FreeBSD上,我得到:

awk:261764 纳克:261763 base64的输出以适当的列大小包装76列 每一行都以换行结束。awk的getline函数只读取 标准输入的下一行和剩余的行将被丢弃。 那么请你试试:

awk --field-separator '|' '{ while ("echo "$mybinaryhere" | xxd -r -p | base64" | getline) print }' myfile.csv

欢迎来到SO,很好,你已经向我们展示了你的代码,你尝试在你的问题中这样做,你能在你的帖子中展示输入样本和预期输出样本,然后告诉我们。mybinaryhere来自哪里?如图所示,awk脚本根本没有使用它的输入。也就是说,awk不是为二进制数据设计的。它会将任何0字节解释为字符串终止符,这可能是您看到的行为的原因。@RavinderSingh13-如果您的目标是在base64中编码jpeg文件,我会更新更多信息,为什么不直接说base64 file.jpg或类似的没有awk的东西呢?工作得很好:-谢谢bunchStill awk的目的是什么?echo$mybinaryhere | xxd-r-p | base64做你想做的吗?@tripleee读取我的csv文件,其中包含两列和十六进制图像,而IFS='|'读取-r foo binary baz;doecho$binary | xxd-r-r | base64;完成