배경
여러 호스트의 프로세스를 표시하는 명령을 실행하고 있습니다. 명령은 다음과 같습니다.
execAll -m "$HOSTS" 'hostname; ps -ef | grep build | grep -v grep; ipcs | grep 666'
시도
이제 ipcs | grep 666
명령의 일부를 파이프한 awk '{print $2}'
다음 파이프하여 kill -9
모든 활성 프로세스를 종료하려고 합니다. 내가 시도한 것은 다음과 같습니다.
execAll -m "$HOSTS" 'hostname; ps -ef | grep build | grep -v grep; ipcs | grep 666 | awk '{print $2}' | xargs kill -9'
그러나 awk
인수를 실행하려면 작은따옴표가 필요하며 위 명령에도 작은따옴표가 필요합니다. 제가 받은 오류는 Missing }.
위의 참조 문제로 인한 것입니다.
질문
위 상황에서 어떻게 awk
프로세스를 성공적으로 실행하고 종료 할 수 있습니까?
답변1
그러나
awk
인수를 실행하려면 작은따옴표가 필요합니다. [...]
설마. 따옴표는 단지 쉘 구조일 뿐이며 쉘에 달러 기호를 확장하지 말고 문자열을 공백으로 나누는 대신 조각으로 유지하라고 지시합니다. awk가 보는 모든 것은 string 이며 {print $2}
, 그것이 어떻게 생성되었는지 전혀 모릅니다. 큰따옴표와 백슬래시 이스케이프를 사용하여 동일한 효과를 얻을 수 있습니다. 다음은 모두 동일해야 합니다.
awk '{print $2}'
awk "{print \$2}"
awk {print\ \$2}
후자의 두 개는 아무 문제 없이 작은따옴표로 묶인 문자열에 넣을 수 있습니다.
또는 쉘이 Bash이거나 ANSI C 인용을 지원하는 다른 쉘인 경우 $'..'
외부 따옴표를 로 변경한 $'..'
다음 백슬래시를 사용하여 작은따옴표를 이스케이프할 수도 있습니다.
echo $'do or don\'t'
이름에서 알 수 있듯이 다른 C 스타일 이스케이프(예 \n
: , \t
, \"
, \'
, \\
)도 작동합니다 $'..'
.
답변2
awk 자체에는 작은따옴표가 "필요"하지 않습니다. 스크립트 본문에 포함하려는 내용이 포함되어 있는지 확인하기만 하면 됩니다. 다음을 이스케이프하면 큰따옴표가 표시됩니다 $
.
execAll ... '...; ipcs | awk "/666/ {print \$2}" | xargs ...'