나는 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
.
따라서 다음 두 가지 작업을 수행해야 합니다.
- 입력 필드 구분 기호를 줄 바꿈으로 설정합니다.
와일드카드 확장을 비활성화합니다.
set -f;IFS=$'\n'; for i in `.....`;do echo "$i"; done
참고: 역따옴표를 인용하지 마십시오. 그렇지 않으면 루프에 for
여러 인수를 제공하게 되어 전체 ps의 출력이 되어 아무 소용이 없게 됩니다.
화타이