我跑从控制台输出它正确的结果下面的命令: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,而不是整个字符串?
在反引号命令替换中,\
其后$
为just $
。根据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}'"`
也可以。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句