Bash 将“ps-a-u user-F”的输出赋值给SHELL变量
我正在尝试捕获正在运行的VNC会话。所以我使用如下Bash 将“ps-a-u user-F”的输出赋值给SHELL变量,bash,shell,Bash,Shell,我正在尝试捕获正在运行的VNC会话。所以我使用如下 STAT = `ps -a -u user -F | grep "Xvnc :" | grep -v grep` 如果VNC会话正在运行,那么命令ps-a-u user-F的输出是多行的。然后将所有行分配给STAT。我只对一行感兴趣,因为我想要的是为用户运行的VNC的所有会话号。我尝试了下面的命令,使用@作为分隔符而不是\n来解析STAT。它似乎不起作用 STAT = `ps -a -u user -F | grep "Xvn
STAT = `ps -a -u user -F | grep "Xvnc :" | grep -v grep`
如果VNC会话正在运行,那么命令ps-a-u user-F的输出是多行的。然后将所有行分配给STAT。我只对一行感兴趣,因为我想要的是为用户运行的VNC的所有会话号。我尝试了下面的命令,使用@作为分隔符而不是\n来解析STAT。它似乎不起作用
STAT = `ps -a -u user -F | grep "Xvnc :" | grep -v grep | tr -s "\n" "@"
我只需要抓取VNC会话号。感谢您的建议。如果您的ps版本支持它,您最好重新格式化它的输出,使其更易于解析。在我的系统上,我可以执行以下操作:
$ ps -o command= -C Xvnc
Xvnc :1
$ ps_output="$(ps -o command= -C Xvnc)"
$ vnc_display="${ps_output#Xvnc :}"
$ echo $vnc_display
1
当然,这种方法有一些局限性。它不会选择特定的用户,如果您使用其他命令行选项来Xnc,或者如果您有多个会话正在运行,它将不起作用。因此,您可能希望执行以下操作:
$ grep -z "^:" "/proc/$(pgrep -u user Xvnc)/cmdline"
:1
使用命令替换设置为参数,然后如果需要,可以删除冒号。如果一个用户正在运行多个VNC会话,这仍然不起作用。您必须迭代$pgrep-u用户Xvnc的结果。如果您不关心解析良好的输出,因为人类正在处理结果,那么您可以始终这样做:
$ ps $(pgrep -u user Xvnc)
PID TTY STAT TIME COMMAND
3600 pts/2 S 0:00 Xvnc :2
3606 pts/2 S 0:00 Xvnc :3
其工作方式是运行pgrep命令,在本例中,该命令将搜索满足指定条件的进程,该进程以用户用户和命令名Xvnc运行。以下是它的输出结果:
$ pgrep -u user Xvnc
3600
3606
将其编码为$,并使用壳牌公司的命令替代设施。这将获取命令的输出并将其替换为命令行的一部分。有关详细信息,请运行info bash命令替换。当您运行ps$pgrep-u user Xvnc时,它会导致shell将其解释为:
$ ps 3600 3606
这将产生相同的输出。如果使用set-x调试选项,您可以确切地看到Bash在做什么:
$ set -x
$ ps $(pgrep -u user Xvnc)
++ pgrep -u user Xvnc
+ ps 3600 3606
PID TTY STAT TIME COMMAND
3600 pts/2 S 0:00 Xvnc :2
3606 pts/2 S 0:00 Xvnc :3
要处理会话编号列表,请执行以下操作:
$ for snumber in $(ps -a -u USERNAME -F | grep -o -P '[X]vnc :\d+' | awk -F':' '{ print $2 }'); do echo Session ${snumber}; done
Session 2
Session 1
$
要在一个变量中包含会话号列表,请执行以下操作:
LIST=$(ps -a -u USERNAME -F | grep -o -P '[X]vnc :\d+' | awk -F':' '{ print $2 }' | tr '\n' ' ' | sed 's; $;;')
如果您只需要X显示数字,例如:1,:2,您可以尝试:
STAT=`ps -a -u ${USER} -F | \
perl -ne '$\=" ";if (/^.{64,}Xvnc.*?:([0-9]+)/){print $1}'
在深奥的条件下,这可能会更安全一些,因为它在查找Xvnc之前跳过ps输出的前64列,并且regexp非常复杂,无法匹配自身。这将加载带有空格分隔的X显示ID列表的$STAT,例如2 4 6或类似,适用于$STAT中的n;do echo$用户处于打开状态:$n;完成
突发事件:
$\=" "; # print a space after every print command
if (/^ # start of line (matches the input line
.{64,} # at least 64 characters
Xvnc # the bit you wanted
.*? # any other spaces or parameters that might be around
: # find a colon
(\d+) # find, and keep, at least one digit
/x) # (the /x only so I can put comments into the regex here)
{ print $1 } # print the digits that we found in () group 1
perl-ne设置了一个自动while{}循环来读取输入请显示第一个命令的示例输出以及所需的输出?X显示数字?非常好,这会进入我的工具箱。太棒了。我可以有一些解释abt ps$pgrep-u用户XvncSure,额外的解释补充。伟大的答案。修改了一下,因为我只对第8节课感兴趣。将上述命令修改为-ps-a-u cad-F | grep-o-P Xvnc:\d+| grep Xvnc:8-我得到一个错误,表示grep没有这样的文件或目录,Xvnc没有这样的文件或目录,并且Xvnc没有这样的文件或目录。grep输出与模式Xvnc:\d+=>Xvnc后跟:后跟至少一个数字匹配的字符串部分。将它传输到“grep”以从N个Xvnc会话中查找特定数字是什么错误?@Mike:这不是错误,但可能是在您更改之后。我要说的是读曼·格雷普: