Bash 使用命令行输出将AWK模式与变量一起使用

Bash 使用命令行输出将AWK模式与变量一起使用,bash,ubuntu,awk,terminal,Bash,Ubuntu,Awk,Terminal,我需要一些帮助。我有这个命令 df -h | awk '/md2/' | awk '{print $5}' 我希望“/md2/”在变量中设置它search=“/md2/”使用 df -h | awk '$search' | awk '{print $5}' 没有回应,我怎么能这样做 使用: search='md2' df -h | awk -v x="$search" '$0~x{print $5}' 工作原理: -v x=“$search” 这告诉awk定义一个awk变量x,使其值为$

我需要一些帮助。我有这个命令

df -h | awk '/md2/' | awk '{print $5}'
我希望“/md2/”在变量中设置它search=“/md2/”使用

df -h | awk '$search' | awk '{print $5}'
没有回应,我怎么能这样做

使用:

search='md2'
df -h | awk -v x="$search" '$0~x{print $5}'
工作原理:

  • -v x=“$search”

    这告诉awk定义一个awk变量
    x
    ,使其值为
    $search

  • $0~x{print$5}

    $0~x
    告诉awk在变量
    x
    中选择与正则表达式匹配的行。对于所选行,打印字段5

讨论 上面的方法不起作用,因为
$search
在单引号内,这阻止bash将
$search
的值替换为in。您可以通过以下方式看到这一点:

$ search='/md2/';  echo awk '$search'
awk $search
以下工作将起作用:

search='/md2/'
df -h | awk "$search" | awk '{print $5}'
这里,
$search
位于双引号内,bash将展开双引号内的变量

这方面还有两个问题:

  • awk“$search”
    有潜在危险。Awk将执行
    $search
    的任何内容。除非您非常确定内容是什么,否则可能会导致文件损坏或删除等

  • awk的两个用途是不必要的和缓慢的。选择行和打印字段这两个操作都可以在一次调用awk中完成

  • search='/md2/'
    df -h | awk "$search" | awk '{print $5}'