如何将awk结果输出到变量

时间:2015-03-05 23:55:22

标签: shell awk

我需要运行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无法正常工作?以及我如何解决它?

1 个答案:

答案 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}'")