12

我有一个来自以下命令的 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

4 回答 4

8

从 4.2.2 版开始,GNUsed-zor--null-data选项可以做到这一点。例如:

sed -z 's/old/new' null_separated_infile
于 2014-03-22T11:55:05.337 回答
6

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

 awk 'BEGIN { RS = "/" } ; { print $0 }' BBS-list
于 2012-02-07T02:23:14.930 回答
2

是的,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=="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将最大参数设置echo为 1,这样输出将由换行符分隔。


正如格雷姆的回答所示,sed也可以这样做。

于 2019-06-11T08:14:27.747 回答
1

用于sed删除null字符 -

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

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

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

使用tr

tr -d "\000" < infile > outfile
于 2012-02-07T02:50:56.050 回答