是的,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也可以这样做。