我需要运行hadoop命令列出所有活动节点,然后根据输出我使用awk命令重新格式化它,并最终将结果输出到变量,每次调用它时awk使用不同的分隔符:
hadoop job -list-active-trackers | sort | awk -F. '{print $1}' | awk -F_ '{print $2}'
它输出如下结果:
hadoop-dn-11
hadoop-dn-12
...
然后我将整个命令放在变量中以逐行打印出结果:
var=$(sudo -H -u hadoop bash -c "hadoop job -list-active-trackers | sort | awk -F "." '{print $1}' | awk -F "_" '{print $2}'")
printf %s "$var" | while IFS= read -r line
do
echo "$line"
done
awk -F没有'工作,它输出结果为:
tracker_hadoop-dn-1.xx.xsy.interanl:localhost/127.0.0.1:9990
tracker_hadoop-dn-1.xx.xsy.interanl:localhost/127.0.0.1:9390
为什么带-F的awk无法正常工作?以及我如何解决它?
答案 0 :(得分:2)
var=$(sudo -H -u hadoop bash -c "hadoop job -list-active-trackers | sort | awk -F "." '{print $1}' | awk -F "_" '{print $2}'")
因为您将整个命令括在双引号中,所以shell在启动sudo之前会扩展变量$1
和$2
。这就是sudo命令的样子(假设$ 1和$ 2为空)
sudo -H -u hadoop bash -c "hadoop job -list-active-trackers | sort | awk -F . '{print }' | awk -F _ '{print }'"
所以,你看到你的awk命令分别打印整行而不是第一和第二个字段。
这仅仅是一个引用挑战
var=$(sudo -H -u hadoop bash -c 'hadoop job -list-active-trackers | sort | awk -F "." '\''{print $1}'\'' | awk -F "_" '\''{print $2}'\')
bash单引号字符串不能包含单引号,这就是为什么你看到...'\''...
- 关闭字符串,连接文字单引号,然后重新打开字符串。
另一种方法是逃避变量和内部双引号:
var=$(sudo -H -u hadoop bash -c "hadoop job -list-active-trackers | sort | awk -F \".\" '{print \$1}' | awk -F \"_\" '{print \$2}'")