【问题标题】:bash: awk print inside functionbash:awk在函数内打印
【发布时间】:2015-04-09 00:23:43
【问题描述】:

如果我有这样的功能:

function getIP() {
    local ip=$(cat /etc/hosts | awk '/${1:-domain}/{print $1}')
    echo "$ip"
}

如何防止 $1 'print $1' 成为传递给函数的参数?

所以基本上我想调用它并得到类似:cat /etc/hosts | awk '/domain/{print $1}'

但我目前使用默认参数获取:cat /etc/hosts | awk '/domain/{print }'

并带有传递的参数:cat /etc/hosts | awk '/test/{print test}'

我尝试转义它,但这给了我一个 bash 错误:

awk: /${1:-domain}/{print \$1}
awk:                      ^ backslash not last character on line

【问题讨论】:

    标签: linux bash shell awk


    【解决方案1】:

    你可以使用:

    getIP() {
        awk -v h="${1:-domain}" '$0 ~ h{print $1}' /etc/hosts
    }
    
    • 将变量传递给awk 使用-v varname=value
    • 没必要用没用的猫
    • 如果你只是在做一个echo,就不需要创建一个局部变量ip

    【讨论】:

    • 谢谢 - 这确实有效。愚蠢的问题(对不起-shell新手),但如果你不回显,函数怎么知道要返回什么?
    • awk 和 echo 一样,打印到标准输出,所以无论 awk 打印什么,这就是您的函数打印的内容,这就是您使用 $() 捕获的内容。
    • 要明确一点:虽然这可以正确实现 OPs 代码,但 OPs 方法几乎肯定是错误的,并且会为 $1 的某些值产生不希望的输出。当然,如果没有样本输入和预期输出,我们就无法判断......
    • 我能够通过添加 eval 并转义 $1 来使用原始代码使其工作:cat /etc/hosts | eval "awk '/${1:-domain}/{print \$1}'"
    猜你喜欢
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 2016-03-15
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    相关资源
    最近更新 更多