【问题标题】:Need help escaping from awk quotations in bash script需要帮助从 bash 脚本中的 awk 引号中转义
【发布时间】:2017-02-09 16:10:12
【问题描述】:

我的 bashrc 文件中有一个别名,用于输出当前文件夹内容和系统可用存储空间,由 watch 函数持续更新。

alias wtch='watch -n 0 -t "du -sch * -B 1000000 2>/dev/null | sort -h && df -h -B 1000000| head -2 | awk '{print \$4}'"'

在我放入 awk 部分之前,字符串运行良好。我知道我需要转义单引号,同时仍然保留在双引号和 $4 中,但我无法让它工作。我做错了什么?

这是我得到的错误

-bash: alias: $4}": not found

【问题讨论】:

    标签: bash awk watch


    【解决方案1】:

    由于别名的引用很困难,你可以把它变成一个函数:

    wtch() {
        watch -n 0 -t "du -sch * -B 1000000 2>/dev/null | sort -h && df -h -B 1000000| head -2 | awk '{print $4}'"
    }
    

    这很像BashFAQ/050 中的第 2 期

    另外,一件小事,但您可以在最后跳过head 进程,让awk 执行此操作,甚至在第二行之后退出

    wtch() {
        watch -n 0 -t "du -sch * -B 1000000 2>/dev/null | sort -h && df -h -B 1000000| awk '{print $4} NR >= 3 {exit}'"
    }
    

    【讨论】:

    • @EdMorton 再次感谢 Ed!我像往常一样(大部分)采纳了你的建议
    【解决方案2】:

    在这种情况下,您可以使用cut 代替awk。你也会有同样的效果。

    alias wtch="watch -n 0 -t 'du -sch * -B 1000000 2>/dev/null | sort -h && df -h -B 1000000| head -2 | cut -d\  -f4'"
    

    解释cut

    -d option defines a delimiter
    -d\  means that my delimiter is space
    -f selects a column
    -f4 gives you the fourth column
    

    【讨论】:

      猜你喜欢
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 2017-04-14
      相关资源
      最近更新 更多