2012-08-17 96 views
0

我试图让所有进程的名称在“屏幕-list”linux的bash脚本切串字符的第一次出现后

不幸的是,我已经不能在循环,因为

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

您的解决方案仍然使用不必要的管道。请记住,你可以用grep做任何事情,你也可以用awk做。 – ghoti 2012-08-17 02:23:09

回答

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

但目前还没有必要管到grep的awk的;只需要awk匹配正则表达式本身。

+0

Thx快速回答。钍,在我可以检查这是否适用于我之前,我仍然需要让循环输出一行代替4 ^^ – Andy 2012-08-17 01:33:55

+0

这很简单。 '屏幕... | awk ...' – 2012-08-17 01:35:27

+0

Thx,在我的循环中完美工作,我只需将“打印$ 2”更改为“打印$ 3”即可。 $ 2给了我进程ID。 – Andy 2012-08-17 01:54:04

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的任何外部工具。它会更便携,更快速,资源更少。

+0

这两个示例都会在我的机器上输出整行,“processname(16/08/12 12:59:37)(Detached)”。 – Andy 2012-08-17 01:49:16

+0

啊,我的屏幕名称有多个点。修订 - 请再次检查。 – ghoti 2012-08-17 01:54:52

+0

增加了一个仅限bash的方法。我更喜欢这个基于awk的解决方案。 – ghoti 2012-08-17 02:34:56

相关问题