![awk에서 쉘 변수를 사용하지 않는 이유는 무엇입니까?](https://linux55.com/image/166250/awk%EC%97%90%EC%84%9C%20%EC%89%98%20%EB%B3%80%EC%88%98%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
일부 문제를 해결하기 위해 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 변수를 확장하여 올바른 텍스트를 가져오기 때문에 인용 문제를 방지합니다.