awk 添加先前启动的变量 bash

awk add previously initiated variable bash

我在向 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 }' file)  
awk -v var3="$var" '/Device/ {print var3, "->", , "[Label: "$var2"]}' file

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

我想要的输出:

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

其他 40 个输入依此类推....

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

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

谢谢!

如果我理解你正在尝试做的正确,这可以在纯 awk 中更好地实现:

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

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

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

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

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

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

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