如何将“ / proc / * / environ”文件分成几行?


19

我正在尝试以/proc/*PID*/environ更具可读性的格式获取任何文件的内容。我可以按照下面显示的方式进行操作,但是我确信这不是正确的方法。

$ cat "/proc/$(pgrep gnome-session -n -U $UID)/environ"
USER=spasTEXTDOMAIN=im-configXDG_SEAT=seat0XDG_SESSION_TYPE=waylandSHLVL=1QT4_IM_MODULE=ximHOME=/home/spasDESKTOP_SESSION=ubuntuGNOME_SHELL_SESSION_MODE=ubuntuDBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/busIM_CONFIG_PHASE=2LOGNAME=spasGTK_IM_MODULE=ibusJOURNAL_STREAM=9:147845_=/usr/bin/gnome-sessionUSERNAME=spasXDG_SESSION_ID=70PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/binXDG_RUNTIME_DIR=/run/user/1000LANG=en_US.UTF-8XDG_CURRENT_DESKTOP=ubuntu:GNOMEXDG_SESSION_DESKTOP=ubuntuXMODIFIERS=@im=ibusSHELL=/bin/bashGDMSESSION=ubuntuTEXTDOMAINDIR=/usr/share/locale/XDG_VTNR=2QT_IM_MODULE=ximPWD=/home/spasCLUTTER_IM_MODULE=ximXDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktopXDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
$ cat -e "/proc/$(pgrep gnome-session -n -U $UID)/environ"
USER=spas^@TEXTDOMAIN=im-config^@XDG_SEAT=seat0^@XDG_SESSION_TYPE=wayland^@SHLVL=1^@QT4_IM_MODULE=xim^@HOME=/home/spas^@DESKTOP_SESSION=ubuntu^@GNOME_SHELL_SESSION_MODE=ubuntu^@DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus^@IM_CONFIG_PHASE=2^@LOGNAME=spas^@GTK_IM_MODULE=ibus^@JOURNAL_STREAM=9:147845^@_=/usr/bin/gnome-session^@USERNAME=spas^@XDG_SESSION_ID=70^@PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin^@XDG_RUNTIME_DIR=/run/user/1000^@LANG=en_US.UTF-8^@XDG_CURRENT_DESKTOP=ubuntu:GNOME^@XDG_SESSION_DESKTOP=ubuntu^@XMODIFIERS=@im=ibus^@SHELL=/bin/bash^@GDMSESSION=ubuntu^@TEXTDOMAINDIR=/usr/share/locale/^@XDG_VTNR=2^@QT_IM_MODULE=xim^@PWD=/home/spas^@CLUTTER_IM_MODULE=xim^@XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop^@XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg^@
$ cat -e "/proc/$(pgrep gnome-session -n -U $UID)/environ" | sed 's/\^@/\n/g'
USER=spas
TEXTDOMAIN=im-config
XDG_SEAT=seat0
XDG_SESSION_TYPE=wayland
...

也许我必须为指定一个特定的值$IFS,但这是什么?实现上述结果的正确方法是什么?

Answers:


25

条目由空字符分隔,请参阅man 5 proc

/proc/[pid]/environ
      This file contains the environment for the process.  The entries
      are separated by null bytes ('\0'), and there may be a null byte
      at  the  end.

因此,一种简单的方法是对其进行应用xargs -0 -L1

$ xargs -0 -L1 -a /proc/self/environ
LC_CTYPE=UTF-8
USER=muru
LOGNAME=muru
HOME=/home/muru
MAIL=/var/mail/muru
SHELL=/bin/zsh
...
  • -0 -读取以空分隔的行,
  • -L1 -每次执行命令读取一行
  • -a file 从读取行 file
  • 如果未指定命令,则xargs仅打印该行。

各种GNU命令有选择与空分隔的数据的工作:-zsedsortuniqgrep等,并为文件名,-print0find-Z使用grep。

或者,您可以使用普通的旧bash:

while IFS= read -d '' -r line
do
    printf "%q\n" "$line"
done < /proc/.../environ

-d ''告诉read您读取直到为空字节为止,IFS=-r防止字段拆分和反斜杠转义,以便按原样读取数据,%q并在输出中引用特殊字符。

由于您使用过sed,因此可以完成以下操作:

sed -z 's/$/\n/' /proc/.../environ

只需在每个以空分隔的行结尾处添加换行符即可。


1
+1为默认xargs打印,我不知道这一点
Vincent Fourmond

2
但是请记住,这些条目恰好是空终止的,因为它是唯一不能作为值一部分的字符。如果将它们替换为换行符,则可能会引起歧义,即两个连续的行代表两个变量,还是一个变量的值包含换行符,后跟一个赋值。
chepner

13
  • 您可以使用cut

    cut -d '' -f1- --output-delimiter=$'\n' /proc/$pid/environ

    使用null作为分隔符,并输出换行符分隔符,可以选择仅选择某些字段/行。

  • 或通过过滤tr,将null转换为换行符:

    tr '\0' '\n' </proc/$pid/environ
  • 或者只是坚持使用您的sed版本...


4
tr '\0' '\n'自从我回忆起就一直在使用。这是我表达“用换行符替换所有NUL”的最直观的方式,因此也是我个人首选的解决方案。
egmont

10

您可以使用strings以下方法:

strings /proc/$(pgrep gnome-session -n -U $UID)/environ

输出样本:

$ strings /proc/$(pgrep gnome-session -n -U $UID)/environ
GNOME_KEYRING_PID=
LANGUAGE=en_US
J2SDKDIR=/usr/lib/jvm/java-8-oracle
LC_TIME=en_US.UTF-8
XDG_SEAT=seat0
XDG_SESSION_TYPE=x11
COMPIZ_CONFIG_PROFILE=ubuntu
SESSION=ubuntu

男人弦

名称

   strings - print the strings of printable characters in files.

描述

   For each file given, GNU strings prints the printable character
   sequences that are at least 4 characters long (or the number given with
   the options below) and are followed by an unprintable character.  By
   default, it only prints the strings from the initialized and loaded
   sections of object files; for other types of files, it prints the
   strings from the whole file.

   strings is mainly useful for determining the contents of non-text
   files.

1
那好美丽。
囚犯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.