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

名前だけが必要な場合は、行全体ではなく名前だけを取得しましょう。

# 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 に答える
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 に答える