我试图在" 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
答案 0 :(得分:0)
$ awk -F '[ \t\n\v\r.]' '{print $2}' <<< $'3698.processname (16/08/12 12:59:37) (Detached)'
processname
但是没有必要把grep管道输入awk;只是让awk匹配正则表达式本身。
答案 1 :(得分: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
#
当然,你可以用纯粹的狂欢来避免大部分噪音:
screen -list | while read name status; do
if [[ $status =~ ched ]]; then
echo "${name#*.}"
fi
done
这可能是您最好的解决方案,因为它不依赖于任何外部工具,如awk或grep。它将更便携,更快速,资源消耗更少。