如何在bash中使用AWK添加NUL字符分隔符?

时间:2015-08-30 04:07:44

标签: bash awk nul

我有一个输出一些文件路径的函数,我需要这些路径由NUL字符串而不是新行\n字符分隔。我尝试了以下代码:

function myfunc
{
  declare -a DUPS
  # some commands to fill DUPS with appropriate file/folder paths
  ( for i in "${DUPS[@]}"; do echo "$i"; done )|sort|uniq|awk 'BEGIN{ORS="\x00";} {print substr($0, index($0, $2))}'
}

但如果我将其输出管道传输到hexdumphd,则不会显示NUL字符。似乎NUL字符未包含在awk输出中:

myfunc | hd

将打印:

00000000  2f 70 61 74 68 2f 6e 75  6d 62 65 72 2f 6f 6e 65  |/path/number/one|
00000010  2f 2f 70 61 74 68 2f 6e  75 6d 62 65 72 2f 74 77  |//path/number/tw|
00000020  6f 2f 2f 70 61 74 68 2f  6e 75 6d 62 65 72 2f 74  |o//path/number/t|
00000030  68 72 65 65 2f                                    |hree/|
00000035

我的awk版本是:

~$ awk -W version
mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan

compiled limits:
max NF             32767
sprintf buffer      2040

使用其他命令(例如sed)的任何解决方案对我来说都是可以接受的 注意:我的问题与enter link description here不重复,因为它要求的解决方案适用于具有不同awk s的不同计算机。但我只需要一个可以在我自己的机器上运行的解决方案,所以我可以使用任何可以安装在Ubuntu 14.04上的awk版本。

1 个答案:

答案 0 :(得分:2)

Gnu Awk v4.0.1与您的原始程序一起运行得很好,但我所有其他问题(mawkoriginal-awkbusybox awk)都会产生相同的NUL-free您似乎正在经历的输出。看来,使用print或printf打印带有嵌入式NUL的字符串会导致NUL被视为字符串终止符。

但是,如果您使用mawkoriginal-awkprintf "%s",0;将输出真正的NUL。因此,如果您正在使用其中一个,则可以将ORS设置为空字符串,并将{printf "%s", 0;}添加到a​​wk程序的末尾。 (如果你的awk程序使用next),你需要进行其他更具侵略性的修改。

我不知道如何说服busybox awk打印一个NUL字节,所以如果你正在使用它,你可能会考虑选择一个真正的awk。