2012-08-17 67 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

相關問題