Awk忽略打印单列。 sh -c

时间:2014-08-12 22:32:06

标签: linux bash shell awk

我在尝试将此命令包装在另一个命令中时遇到了麻烦。

# Target Command:
/bin/df / | awk END' { gsub(/\%/, ""); print $5} '

# What I want:
/bin/sh -c " [command above goes here]"

我遇到了awk和所有引号的问题...... 我试过了:

bin/sh -c "/bin/df / | awk END' { gsub(/\%/, "'"''"'"); print $5} '"

但问题是awk似乎在这个例子中只打印了$ 5列。 如何修复上述命令awk命令仅打印第5列(最后一行)?

PS:我尝试做的是获取所用磁盘的百分比(不包括%符号)。由于我是通过一个不会轻易支持管道的程序来调用它的,所以我使用的是sh -c

3 个答案:

答案 0 :(得分:3)

您可以使用:

/bin/sh -c "/bin/df | awk 'END{gsub(/%/, \"\", \$5); print \$5}'"

$也需要转义。

根据@ Ed的评论,如果$5在某些版本的awk END块中不可用,请使用:

/bin/sh -c "/bin/df | awk '{p=\$5} END{sub(/%/, \"\", p); print p}'"

答案 1 :(得分:2)

您需要转发"$

/bin/sh -c "/bin/df / | awk END' { gsub(/\%/, \"\"); print \$5} '"

您不需要在原始行中转义$的原因是:因为它由''保护。但是当你引用蜱(带双引号)时,它们会失去这种保护性质。 "需要进行转义,因为它们会过早终止您的最外面的双引号。

但是很可能更容易将所有内容放入shell脚本并启动它。这也允许您设置PATHIFS等更多行,也可以进行(g)awk等平台特定搜索。

BTW:如果可能的话,我会添加-x nfs(Linux)或-t nonfs,nullfs(BSD)。众所周知,如果重复启动(NFS服务器不可用),监视脚本将终止系统。当然,这样,您不想监视NFS。

答案 2 :(得分:0)

你可以让bash用导出的函数来解决繁重的问题:

myfunc() {
  /bin/df / | awk 'END { gsub(/\%/, ""); print $5} '
}
export -f myfunc

bash -c "myfunc"

通过这种方式,你不必乱搞无法逃避的事情。