我有一个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工具。
感谢您的任何建议。
劳伦斯
答案 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
也可以做到这一点。