【问题标题】:awk add previously initiated variable bashawk 添加先前启动的变量 bash
【发布时间】:2015-07-01 08:11:54
【问题描述】:

我在向 AWK 添加变量时遇到了问题。

我有一个包含以下输入的文件:

MainComputer>
Device ID: name1
Interface: 1
random text...
Device ID: name2
Interface: 2
random text....
Device ID: name3
Interface: 3
random text....

现在我想打印所有变量:我已经拥有的:

#!/bin/bash
line=$(head -n 1 file)
var=$(echo $line | cut -d ">" -f1)
var2=$(awk '/Interface/  {print $2}' file)  
awk -v var3="$var" '/Device/ {print var3, "->", $2, "[Label: "$var2"]}' file

但是 $var2 没有显示输出,如果我输入: var2 它会给出错误。

我想要的输出:

MainComputer -> name1 [Label: 1]
MainComputer -> name2 [Label: 2]
MainComputer -> name3 [Label: 3]

对于其他 40 个输入,依此类推......

但它只给出 MainComputer -> name1 和接口标签上的错误...

所以我正在寻找一种方法来打印我已经初始化的多个 var。

还是谢谢!

【问题讨论】:

  • 您要查找的输出是什么?你能编辑你的问题给我们看吗?
  • 很明显,为什么你正确分配了-v var3="$var",然后却试图在里面使用$var2。 Shell 变量不要用单引号展开,你的整个 awk 命令都用单引号括起来。
  • 就是你想要的那一行吗?您不想为name2name3 显示任何内容吗?

标签: bash variables printing awk


【解决方案1】:

如果我理解您尝试正确执行的操作,则可以在纯 awk 中更好地实现:

awk -F ': *' 'NR == 1 { sub(/>.*/, ""); name = $0; next } $1 == "Device ID" { dev = $2 } $1 == "Interface" { print name " -> " dev " [Label: " $2 "]" }' file

-F ': *' 将字段分隔符设置为正则表达式: *(匹配冒号后跟任意数量的空格)。代码工作如下:

NR == 1 {           # in the first line:
  sub(/>.*/, "")    # remove > and everything after it
  name = $0         # remember as machine name
  next              # do nothing else
}
$1 == "Device ID" { # after that: In device lines
  dev = $2          # remember device name
}
                    # In interface lines: print remembered info
$1 == "Interface" {
  print name " -> " dev " [Label: " $2 "]"
}

这将按照您在问题中显示的方式显示文件中的所有行。如果要过滤特定行,可以修改如下:

awk -v filter="name2" -F ': *' 'NR == 1 { sub(/>.*/, ""); name = $0; next } $1 == "Device ID" { dev = $2 } $1 == "Interface" && dev == filter { print name " -> " dev " [Label: " $2 "]" }' file

即用-v filter=value制作一个awk已知的变量filter,并修改代码

NR == 1 {
  sub(/>.*/, "")
  name = $0
  next
}
$1 == "Device ID" {
  dev = $2     
}
$1 == "Interface" && dev == filter {         # <-- here
  print name " -> " dev " [Label: " $2 "]"
}

【讨论】:

    猜你喜欢
    • 2011-11-03
    • 2022-10-15
    • 2020-09-09
    • 2016-01-01
    • 2021-08-22
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 2015-02-17
    相关资源
    最近更新 更多