배경

배경

배경

여러 호스트의 프로세스를 표시하는 명령을 실행하고 있습니다. 명령은 다음과 같습니다.

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

관련 정보