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 脚本存在许多问题,但这似乎是核心混乱。
我正在编写一个小脚本来映射服务器中服务 运行 使用的所有当前内存。但是,我在这样做时遇到了问题。我的脚本很简单。我正在使用 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 脚本存在许多问题,但这似乎是核心混乱。