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