0

我正在尝试获取“screen -list”中所有进程的名称

不幸的是,我已经在循环中失败了,因为

for PLINE in `screen -list | grep 'tached)'`; do
    echo "$PLINE"
done

输出

3698.processname
(16/08/12
12:59:37)
(Detached)

但我的预期输出是

    3698.processname    (16/08/12 12:59:37)    (Detached)

就像直接输入screen -list | grep 'tached)'控制台时一样。

如果这个循环可以工作,我试图做的是使用cut -d '.' -f 2然后在找到第一个空格之后切断结果字符串。(我还不太清楚该怎么做,我所知道的只是一些东西%' '

所以,我认为很明显我在 bash 脚本中没有太多线索,因此我愿意接受更优雅的建议来做我想做的事情。

(编辑)解决方案:

for PLINE in `screen -list | grep 'tached)' | awk -F '[ \t\n\v\r.]' '{print $3}'`; do
    echo $PLINE
done
4

2 回答 2

0
$ awk -F '[ \t\n\v\r.]' '{print $2}' <<< $'3698.processname    (16/08/12 12:59:37)    (Detached)'
processname

但是没有必要将 grep 输入到 awk 中;只需让 awk 匹配正则表达式本身。

于 2012-08-17T01:32:00.930 回答
0

如果你想要的只是名字,那么让我们抓住它而不是整行。

# screen -list
There are screens on:
    85384.ttyv3.filer0  (Attached)
    85617.another   (Detached)
    57491.pts-0.filer0  (Dead ???)
Remove dead screens with 'screen -wipe'.
2 Sockets in /tmp/screens/S-root.

# screen -list | awk '/ched/{split($1,a,".");print a[2]}'
ttyv3 another
#   

你想要它在一个变量中?一个for循环?

# read names <<<$(screen -list | awk '/ched/{split($1,a,".");print a[2]}')
# echo $names
ttyv3 another
# for name in $names; do echo "name=$name"; done
name=ttyv3
name=another
#

当然,您可以使用纯 bash 避免大部分噪音:

screen -list | while read name status; do
  if [[ $status =~ ched ]]; then
    echo "${name#*.}"
  fi
done

这可能是您最好的解决方案,因为它不依赖于任何外部工具,如 awk 或 grep。它将更便携、更快、资源消耗更少。

于 2012-08-17T01:37:40.820 回答