输出awk命令结果变量

时间:2015-02-28 01:35:22

标签: awk

我从控制台运行以下命令,输出正确的结果:0

sudo -H -u hadoop bash -c "/home/hadoop/hadoop-install/bin/hadoop dfsadmin -report | grep 'Under replicated blocks' | awk '{print \$4}'"

但是,如果我把它放在shell脚本中并将其分配给变量,'awk'将不再起作用,它只输出'grep'的整个结果:

replications=`sudo -H -u hadoop bash -c "/home/hadoop/hadoop-install/bin/hadoop dfsadmin -report | grep 'Under replicated blocks' | awk '{print \$4}'"`
echo "Replications: $replications"

结果:Replications: Under replicated blocks: 0 如何使awk再次工作只输出第4列,而不是整个字符串?

1 个答案:

答案 0 :(得分:1)

在反引号命令替换中,\后跟$仅表示$。来自POSIX标准:

  

在反引号的命令替换方式中,反斜杠应保留其字面含义,除非后面跟着:' $','`'或' \& #39; (美元符号,反引号,反斜杠)。 (...)

     

使用$(command)形式,匹配右括号的左括号后面的所有字符构成命令。任何有效的shell脚本都可以用于命令,除了一个只包含重定向的脚本,它会产生未指定的结果。

而且更明确地来自bash手册页:

  

当使用旧式反引号替换形式时,反斜杠保留其字面含义,除非后跟$,`或\。第一个不带反斜杠的反引号会终止命令替换。使用$(command)表单时,括号内的所有字符组成命令;没有人受到特别对待。

所以最简单的方法是使用

replications=$(sudo -H -u hadoop bash -c "/home/hadoop/hadoop-install/bin/hadoop dfsadmin -report | grep 'Under replicated blocks' | awk '{print \$4}'")

replications=`sudo -H -u hadoop bash -c "/home/hadoop/hadoop-install/bin/hadoop dfsadmin -report | grep 'Under replicated blocks' | awk '{print \\\$4}'"`

也有效。