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: " "]"
}
我在向 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: " "]"
}