"for" 및 grep/egrep을 사용한 스크립팅

"for" 및 grep/egrep을 사용한 스크립팅

나는 Linux에 대해 더 많이 배우려고 노력하고 있으며 경험상 가장 좋은 방법은 벽에 머리를 부딪히는 것입니다. 이제 작업을 수동으로 몇 번 수행했으므로 자동화하고 싶습니다. 여기에는 다시 시작할 수 있도록 일부 작업을 종료하는 oneliner를 만드는 것이 포함됩니다.

현재 저는 다음 작업을 하고 있습니다:

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

루프 출력 은 for단어 경계(예: 공백/줄 바꿈)에서 분할됩니다. 그리고 당신이 원한다고 말한 것은 $i.

따라서 다음 두 가지 작업을 수행해야 합니다.

  1. 입력 필드 구분 기호를 줄 바꿈으로 설정합니다.
  2. 와일드카드 확장을 비활성화합니다.

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

참고: 역따옴표를 인용하지 마십시오. 그렇지 않으면 루프에 for여러 인수를 제공하게 되어 전체 ps의 출력이 되어 아무 소용이 없게 됩니다.

화타이

관련 정보