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

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

我试图使用 awk 来解决一些问题,但我无法理解为什么这些行不起作用。

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

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

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

一切都很好,我已经得到了正确的输出,但我需要使用这个变量“名称”,所以我不能这样保留它。请大家帮我看看哪里出了问题,谢谢。

答案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 中使用 shell 变量,最好将 awk 变量设置为 shell 变量的值:

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

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

相关内容