Scripting com 'for' e grep / egrep

1

Estou tentando aprender um pouco mais de Linux e, por experiência, a melhor maneira é tentar bater a cabeça contra a parede. Então, agora que fiz uma tarefa manualmente algumas vezes, gostaria de automatizá-la. Isso envolve fazer um oneliner para matar algumas tarefas para que eu possa reiniciá-las.

No momento, estou trabalhando com o seguinte:

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

A coisa é que, assim que eu executo o loop for, ele quebra as linhas que eu recebo do awk.

correndo %código% me dá o resultado que estou procurando, a saber:

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

Mas adicioná-lo ao meu loop for divide-o em:

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...

Meu objetivo é que $ i contenha toda a linha - isso é possível? Além disso, é possível usar apenas o comando de $ 11 e $ 12? Eu não preciso ter todo o caminho para python e nem preciso ter o caminho completo para o aplicativo.

Obrigado!

    
por Lars 02.07.2017 / 16:34

1 resposta

1

Observe que a saída do loop for está quebrada nos limites de palavras, a saber, whitespaces / newlines. Considerando que o que você disse que você queria é toda a linha para vir contida no $i .

Então você precisa fazer essas duas coisas:

  1. define o separador do campo de entrada para uma nova linha.
  2. desative a expansão dos curingas.

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

Nota: NÃO cite os backquotes, senão você acabará dando ao for um grande bloco de argumentos, o que seria a saída do ps inteiro, e isso não faz bem a você.

HTH

    
por 02.07.2017 / 19:13