【问题标题】:can not use unix $variable in awk command [duplicate]不能在 awk 命令中使用 unix $variable [重复]
【发布时间】:2014-02-28 16:04:38
【问题描述】:

我在我的 unix 环境中设置了以下变量。如果我尝试在 awk 命令中使用它,它不起作用,但是当我不使用 $b 变量时,相同的命令正在工作

$b="新"

当我尝试执行命令时它不起作用

 echo "$a" | tr [a-z] [A-Z]  |awk -v RS=, '/TABLE/&&/CREATE/&&/`echo ${b}`/{print $NF}'

但是,如果我将 $b 值替换为 NEW 为 低于其工作

 echo "$a" | tr [a-z] [A-Z]  |awk -v RS=, '/TABLE/&&/CREATE/&&/NEW/{print $NF}'

【问题讨论】:

    标签: linux bash shell unix awk


    【解决方案1】:

    你不能像这样在awk 中使用bash var。相反,使用:

    echo "$a" | tr [a-z] [A-Z] | awk -v RS=, -v myvar=$b '/TABLE/&&/CREATE/&& $0~myvar {print $NF}'
    

    看一个例子:

    $ var="hello"
    $ awk -v text=$var 'BEGIN{print text}'
    hello
    

    另外,对我来说,它适用于 tr 'a-z' 'A-Z' 而不是 tr [a-z] [A-Z]。根据Mark Setchell 的建议,您可以使用IGNORECASE = 1 跳过它:

    echo "$a" | awk -v RS=, -v myvar=$b 'BEGIN{IGNORECASE=1} /TABLE/&&/CREATE/&& $0~myvar {print $NF}'
    

    【讨论】:

    • 同意,关于tr,其实在awk脚本中设置IGNORECASE=1可能更优雅。
    • 这是一个非常好的观点,@MarkSetchell 如果您不介意我会将其添加到我的答案中,以确保完整性。谢谢!
    • @fedorqui : 如果 $b 有 '_' 它不工作
    • @logan 请使用示例输入和所需输出更新您的问题。否则我们太抽象了,无法给出真正的答案。
    • @logan 你一开始并没有要求。不要在 cmets 中提出更多问题,也不要在每个答案中重复它们,而是 Ask a new question。你想要什么会更清楚,人们会很高兴不必一遍又一遍地更新答案。
    【解决方案2】:

    关于你的问题:

    if i replace the $b value to NEW as below its working
    

    之所以有效,是因为您的变量的值为NEW,而您最终要做的是在regex 中使用它,这正是它应该做的。

    关于你的第二个问题:

    can not use unix $variable in awk command
    

    你不能像这样在awk 中使用shell 变量。您需要通过使用-v 选项并分配您的bash 变量来创建awk 变量。

    awk -v awkvar="$bashvar" '/ /{ ... }'
    

    这使您现有的语法为:

    echo "$a" | tr [a-z] [A-Z]  | awk -v RS=, -v var="$b" '/TABLE/&&/CREATE/&&/var/{print $NF}'
    

    这再次不起作用,因为内部/../ 变量没有被插值,这意味着它们被认为是字面意思。所以,你需要这样做:

    echo "$a" | tr [a-z] [A-Z]  |awk -v RS=, -v var="$b" '/TABLE/&&/CREATE/&&$0~var{print $NF}'
    

    【讨论】:

    • 如果 $b 有 '_' 它不工作
    • @logan 定义不起作用?错误?没有输出?
    • awk -v myvar=$b -F'$0~myvar' '{print $2}'这是正确的使用方法吗?
    猜你喜欢
    • 2014-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2017-12-06
    • 2016-12-27
    • 1970-01-01
    相关资源
    最近更新 更多