sed或awk可以使用NUL字符作为记录分隔符吗?

时间:2012-02-07 02:12:22

标签: sed awk nul

我有一个NUL分隔的输出来自以下命令:

some commands | grep -i -c -w -Z 'some regex'

输出包含以下格式的记录:

[file name]\0[pattern count]\0

我想使用文本操作工具(例如sed / awk)将记录更改为以下格式:

[file name]:[pattern count]\0

但似乎sed / awk通常只处理由“换行符”字符分隔的记录。我想知道sed / awk如何用于实现我的目的,或者如果sed / awk无法处理这种情况,我应该使用其他Linux工具。

感谢您的任何建议。

劳伦斯

4 个答案:

答案 0 :(得分:4)

自4.2.2版以来,GNU sed已使用-z--null-data选项来完成此操作。例如:

sed -z 's/old/new' null_separated_infile

答案 1 :(得分:2)

默认情况下,记录分隔符是换行符,将记录定义为单行文本。您可以通过更改内置变量RS来使用其他字符。 RS的值是一个字符串,说明如何分隔记录;默认值为“\ n”,该字符串仅包含换行符。

 awk 'BEGIN { RS = "/" } ; { print $0 }' BBS-list

答案 2 :(得分:0)

使用sed删除null个字符 -

sed 's/\x0/ /g' infile > outfile

或通过执行进行文件内替换(这将备份您的原始文件并用替换覆盖原始文件)。

sed -i.bak 's/\x0/ /g' infile

使用tr

tr -d "\000" < infile > outfile

答案 3 :(得分:0)

是的,gawk可以做到,将记录分隔符设置为\0。例如命令

gawk 'BEGIN { RS="\0"; FS="=" } $1=="LD_PRELOAD" { print $2 }' </proc/$(pidof mysqld)/environ

将打印出LD_PRELOAD变量的值:

/usr/lib/x86_64-linux-gnu/libjemalloc.so.1

/proc/$PID/environ文件是由NUL分隔的环境变量列表。我以它为例,因为在Linux系统上尝试很容易。

BEGIN部分将记录分隔符设置为\0,将字段分隔符设置为=,因为我也想基于{之前的部分来提取=之后的部分{1}}。

如果第一个字段具有我感兴趣的键,则=将运行该块。

$1=="LD_PRELOAD"块在print $2之后打印出字符串。


但是=无法解析用mawk分隔的输入文件。 NUL中对此进行了记录:

man mawk

BUGS mawk cannot handle ascii NUL \0 in the source or data files. 将停止读取第一个mawk字符之后的输入。


您还可以使用\0来处理xargs分离的输入,有点不直观,像这样:

NUL

xargs -0 -n1 </proc/$$/environ 使用xargs作为默认命令。 echo将输入设置为-0分隔。 NUL-n1的max参数设置为1,这样输出将由换行符分隔。


正如Graeme's answer所示,echo也可以做到这一点。