gawk 和 shell 脚本的单引号问题

Single Quote issue with gawk and shell script

我正在编写一个小脚本来映射服务器中服务 运行 使用的所有当前内存。但是,我在这样做时遇到了问题。我的脚本很简单。我正在使用 pmap 找出正在使用的内存并尝试将服务的所有 pid 相加 运行.

#!/bin/bash
result=`$pgrep java`
wc=`$pmap -x $result | wc -l`
gawk=`$pmap -x $result | gawk 'NR==$wc{print }'`

echo "$gawk"

现在,我的问题是 gawk 在搜索特定模式时使用 单引号 (gawk 'NR==$wc{print }') 但是shell 脚本给我错误,因为 单引号 的含义在 shell 中与 gawk 不同。

根据您的评论,您似乎正在尝试这样做:

pmap -x "$(pgrep java)" | awk '{s=}END{print s}'

这将打印 pmap -x 输出最后一行的第三列,以及 运行 java 进程的 PID。在某些版本的 awk 中,您可以简单地执行 'END{print }' 但这不能保证有效。

pmap -x $result | gawk 'NR==$wc{print }' 并没有按照您的想法行事。 (我已将您的 $pmap 替换为 pmap,但我的分析仅针对 gawk 命令,因此如果不正确,它应该是无关紧要的。) shell 将传递文字字符串NR==$wc{print } 到 awk,但您似乎希望 awk 查看 shell 变量 $wc 的值,而不是文字字符串 $wc。当 awk 看到 $wc 时,它会将 wc 视为未初始化的值,因此 $wc 等同于 [=20=],并且 awk 将打印内容与行号匹配的任何行。将 shell 变量传递给 awk 的标准方法是:

pmap -x $result | gawk 'NR==w{print }' w=$wc

这会将 shell 变量 wc 分配给 awk 变量 w,并将打印该行的第三列。

请注意,此 shell 脚本存在许多问题,但这似乎是核心混乱。