为什么在 awk 中不使用 shell 变量?

0 awk

我正在尝试使用 awk 来解决一些问题,但我不明白为什么这些行不起作用。

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

一般在我的系统中有很多进程,所有者是root,但输出为空。当我使用这个时:

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

一切正常,我得到了正确的输出,但我需要使用这个变量“名称”,所以我不能就这样离开它。请帮我找出问题所在,谢谢。

mur*_*uru 6

运行set -x,你会看到:

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

您缺少 周围的引号root,如果没有引号,awk 会将其root视为 awk 变量名,而不是字符串。

但是如果你想在 awk 中使用 shell 变量,最好将 awk 变量设置为 shell 变量的值:

ps -eo user,rss | awk -v name="$name" '$1 == name {print $2}'
Run Code Online (Sandbox Code Playgroud)

这也避免了引用问题,因为现在 awk 将扩展 awk 变量以获得正确的文本。