Да, 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
может сделать это тоже.