我在尝试将此命令包装在另一个命令中时遇到了麻烦。
# 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
。
答案 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脚本并启动它。这也允许您设置PATH
和IFS
等更多行,也可以进行(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"
通过这种方式,你不必乱搞无法逃避的事情。