单引号问题与gawk和shell脚本

时间:2015-04-14 15:35:36

标签: linux bash awk gawk

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

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

echo "$gawk"

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

2 个答案:

答案 0 :(得分:2)

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

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

这将打印pmap -x输出的最后一行的第三列,以及正在运行的java进程的PID。在某些版本的awk中,您只需执行'END{print $3}'即可,但这并不能保证正常工作。

答案 1 :(得分:0)

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

$0

这将shell变量pmap -x $result | gawk 'NR==w{print $3}' w=$wc 分配给awk变量wc,并将打印该行的第三列。

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