web-dev-qa-db-ja.com

'for'とgrep / egrepを使用したスクリプト

私はもう少しLinuxを学ぼうとしています。経験から、壁に頭をぶつけてみるのが最善の方法です。手動でタスクを数回実行したので、自動化したいと思います。これには、いくつかのタスクを強制終了するためのワンライナーを作成して、それらを再起動できるようにすることが含まれます。

現在、私は以下を使用しています。

for i in `ps aux | egrep "[c]ouchpotato|[s]abnzbd|[s]ickbeard|[d]eluge|[n]zbhydra"|awk '{print $2, $11, $12}'`; do echo $i; done

重要なのは、forループを実行するとすぐに、awkから取得した行が分割されるということです。

ランニング ps aux | egrep "[c]ouchpotato|[s]abnzbd|[s]ickbeard|[d]eluge|[n]zbhydra"|awk '{print $2, $11, $12}'私が探している結果を私に与えます、すなわち:

27491 /usr/local/couchpotatoserver-custom/env/bin/python /usr/local/couchpotatoserver-custom/var/CouchPotatoServer/CouchPotato.py
27504 /usr/local/deluge/env/bin/python /usr/local/deluge/env/bin/deluged
27525 /usr/local/deluge/env/bin/python /usr/local/deluge/env/bin/deluge-web
27637 /usr/local/nzbhydra/env/bin/python /usr/local/nzbhydra/share/nzbhydra/nzbhydra.py
27671 /usr/local/sabnzbd/env/bin/python /usr/local/sabnzbd/share/SABnzbd    /SABnzbd.py
28084 /usr/local/sickbeard-custom/env/bin/python /usr/local/sickbeard-custom/var/SickBeard/SickBeard.py

しかし、それを私のforループに追加すると、次のようになります。

27491
/usr/local/couchpotatoserver-custom/env/bin/python
/usr/local/couchpotatoserver-custom/var/CouchPotatoServer/CouchPotato.py
27504
/usr/local/deluge/env/bin/python
/usr/local/deluge/env/bin/deluged
etc...

私の目標は、$ iに行全体を含めることです-これは可能ですか?また、$ 11と$ 12からgetコマンドのみを使用することは可能ですか? pythonへのパス全体を持っている必要はなく、アプリケーションへのパス全体を持っている必要もありません。

ありがとう!

1
Lars

forループ出力は、Wordの境界、つまり空白/改行で分割されていることに注意してください。あなたが望んでいたのは、$iに含まれる行全体です。

したがって、次の2つのことを行う必要があります。

  1. 入力フィールドの区切り文字を改行に設定します。
  2. ワイルドカード展開を無効にします。

    set -f;IFS=$'\n'; for i in `.....`;do echo "$i"; done
    

注:バッククォートを引用しないでください。引用符を付けないと、forループに引数の大きなブロブが1つ与えられます。これは、psの出力全体になりますが、それは役に立ちません。

HTH

1
user218374