【问题标题】:output awk command result to variable将 awk 命令结果输出到变量
【发布时间】:2015-02-28 01:35:22
【问题描述】:

我从控制台运行了以下命令,它输出了正确的结果: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 列,即 0 而不是整个字符串?

【问题讨论】:

    标签: awk


    【解决方案1】:

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

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

    对于$(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}'"`
    

    也可以。

    【讨论】:

      猜你喜欢
      • 2010-12-24
      • 2015-05-07
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 2017-07-21
      • 2012-08-10
      • 2011-12-31
      • 1970-01-01
      相关资源
      最近更新 更多