awk에서 쉘 변수를 사용하지 않는 이유는 무엇입니까?

awk에서 쉘 변수를 사용하지 않는 이유는 무엇입니까?

일부 문제를 해결하기 위해 awk를 사용하려고 하는데 왜 이 줄이 작동하지 않는지 이해할 수 없습니다.

name="root"
ps -eo user:20,rss | awk "{if(\$1==$name) print \$2}"

일반적으로 내 시스템에는 소유자가 루트이지만 출력이 비어 있는 프로세스가 많이 있습니다. 내가 이것을 사용할 때 :

ps -eo user:20,rss | awk '{if($1=="root") print $2}'

모든 것이 괜찮고 올바른 출력을 얻었지만 이 변수 ​​"name"을 사용해야 하므로 이대로 유지할 수 없습니다. 무엇이 잘못되었는지 알아내도록 도와주세요. 감사합니다.

답변1

실행하면 set -x다음이 표시됩니다.

$ ps -eo user,rss | awk "{if(\$1==$name) print \$2}"
+ ps -eo user,rss
+ awk '{if($1==root) print $2}'

따옴표가 누락되었습니다 root. 따옴표가 없으면 awk는 이를 root문자열이 아닌 awk 변수 이름으로 처리합니다.

그러나 awk에서 쉘 변수를 사용하려면 awk 변수를 쉘 변수의 값으로 설정하는 것이 좋습니다:

ps -eo user,rss | awk -v name="$name" '$1 == name {print $2}'

이는 또한 이제 awk가 awk 변수를 확장하여 올바른 텍스트를 가져오기 때문에 인용 문제를 방지합니다.

관련 정보