我从控制台运行以下命令,输出正确的结果: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 :(得分: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}'"`
也有效。