【问题标题】:Getting error while running script to find disk space运行脚本以查找磁盘空间时出错
【发布时间】:2014-10-03 23:43:29
【问题描述】:

我在脚本下面运行:-

#!/bin/bash
threshold="20"
i=2
result=`df -kh |grep -v “Filesystem” | awk ‘{ print $5 }’ | sed ‘s/%//g’`
for percent in $result; do
    if ((percent > threshold))
    then
        partition=`df -kh | head -$i | tail -1| awk ‘{print $1}’`
        echo “$partition at $(hostname -f) is ${percent}% full”
    fi
    let i=$i+1
done

但我收到以下错误:

awk: ‘{
awk: ^ invalid char '▒' in expression
sed: -e expression #1, char 1: unknown command: `▒'

请帮我解决这个问题。

【问题讨论】:

  • 你在什么系统上运行这个?在 Ubuntu 12.04 上试过,效果很好(我复制并粘贴了你上面的内容)。
  • 您是从 Internet 上的某个地方复制/粘贴此代码吗?你有很多引号而不是引号
  • 1) 引用你的变量扩展:mywiki.wooledge.org/Quotes 2) 更喜欢 $() 子进程 mywiki.wooledge.org/BashFAQ/082
  • @ÉdouardLopez 您确实意识到在编辑命令中使用的引号类型时,您可能已经删除了语法错误?
  • @TomFenech 我重新编辑恢复原引号

标签: linux bash shell awk sh


【解决方案1】:

什么awk 不起作用? (你的脚本在我的 Ubuntu 上运行良好)

这一行:

result=`df -kh |grep -v "Filesystem" | awk '{ print $5 }' | sed 's/%//g'`

可以改为:

result=$(df -kh | awk '!/Filesystem/ {print $5+0}')

如果括号如下所示,请避免使用旧的和过时的反引号:var=$(code...)


这个:

partition=`df -kh | head -$i | tail -1| awk '{print $1}'`

可以改为:

partition=$(df -kh | awk -v line="$i" 'NR==line {print $1}')

这个

let i=$i+1

可以改为:

((i++))

这会给出这样的结果:

#!/bin/bash
threshold="20"
i=2
result=$(df -kh | awk '!/Filesystem/ {print $5+0}')
for percent in $result; do
    if ((percent > threshold))
    then
        partition=$(df -kh | awk -v line="$i" 'NR==line {print $1}')
        echo "$partition at $(hostname -f) is ${percent}% full"
    fi
((i++))
done

【讨论】:

  • +1 除了将引号类型更改为正确的类型外,这些都是很好的建议。
【解决方案2】:

您使用 表示单引号,而不是 '。尝试使用编辑器重新编码您的文件。

【讨论】:

    【解决方案3】:

    你得到了语法错误的答案,现在重写整个脚本:

    #!/bin/bash
    df -kh |
    awk -v t=20 -v h="$(hostname -f)" '(NR>1)&&($5+0>t){printf "%s at %s is %s full\n",$1,h,$5}'
    

    【讨论】:

    • 我仍然不确定为什么人们喜欢使用+0 方法来转换为数字。一元加号+$5有什么问题?
    • +$5 的语义不明确且模棱两可,因此最好避免使用。试试awk 'BEGIN{print "foo" x+0}'awk 'BEGIN{print "foo" +x}'。前者将在此上下文中根据需要打印foo0,而后者将打印0。此外,一元 + 仅对某些 awk 进行数字转换,而 +0 对所有 awk 都有效。使用nawk/usr/xpg4/bin/awk 尝试一个简单的awk 'BEGIN{print +x}',你将得到一个NULL 字符串输出而不是0,就像你从gawkawk 'BEGIN{print x+0}'
    • 就个人而言,我希望"foo" +x 产生一个数字结果而不是连接字符串,但是好的,我确实看到了你的逻辑。顺便说一句,我刚刚注意到你答案中的双引号,它们是故意放在那里的吗?!
    • 不,我只是从 OPs 问题中复制/粘贴。我会解决的,谢谢。如果您要使用+$5,您真的应该使用(+$5) 使其明确,但它比$5+0 更长,仍然不那么清晰/明显,而且它仍然无法在多个awks 中工作,所以恕我直言最好只是避免,但无论如何......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 2017-02-16
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多