gpt4 book ai didi

awk - 如何将 BASH shell 变量传递到 AWK 语句中

转载 作者:行者123 更新时间:2023-12-04 13:27:04 27 4
gpt4 key购买 nike

我想将 2 个 shell (bash) 变量传递到 awk 语句中。
在这个例子中,变量是marker1和marker2

ubuntu@ubuntutest:/tmp$ echo $marker1
###___showhost___###
ubuntu@ubuntutest:/tmp$ echo $marker2
###___showhostset___###
ubuntu@ubuntutest:/tmp$

该脚本将从文本文件 - file.in 中提取不同字符串/标记($marker1 和 $marker2)之间的所有文本行
ubuntu@ubuntutest:/tmp$ cat file.in 
###___showhost___###
Id Name Persona -WWN/iSCSI_Name- Port
115 server5295 VMware 5005638024D3E8E6 1:2:4
116 server5296 VMware 5005638024D3EA86 1:2:4
117 server5297 VMware 5005638024D3F5D2 1:2:4
142 server5302 VMware 5005638024D3E8B6 1:2:4
143 server5303 VMware 5005638024D3E9C6 1:2:4
144 server5304 VMware 5005638024D3F4F2 1:2:4
###___showhostset___###
Id Name Members
0 Mgt_Stack server5295
1 Cluster1 server5302
server5304
ubuntu@ubuntutest:/tmp$

如果我运行 awk 语句,我在其中使用变量 marker1/marker2 的实际字符串值###___showhost___### ###___showhostset___### 分别而不是使用变量本身(在 awk 中)我得到了一个积极的结果。但是,我想将 awk 语句放在 bash 脚本中,并且需要读取变量 marker1/marker2。
ubuntu@ubuntutest:/tmp$ awk '/^###___showhost___###/{flag=1;next}/^###___showhostset___###/{flag=0}flag' file.in 
Id Name Persona -WWN/iSCSI_Name- Port
115 server5295 VMware 5005638024D3E8E6 1:2:4
116 server5296 VMware 5005638024D3EA86 1:2:4
117 server5297 VMware 5005638024D3F5D2 1:2:4
142 server5302 VMware 5005638024D3E8B6 1:2:4
143 server5303 VMware 5005638024D3E9C6 1:2:4
144 server5304 VMware 5005638024D3F4F2 1:2:4
ubuntu@ubuntutest:/tmp$

但是,当我在 awk 语句中使用 2 个变量 $marker1 和 $marker2 时,我没有得到任何输出。
ubuntu@ubuntutest:/tmp$ awk '/^"'$marker1'"/{flag=1;next}/^"'$marker2'"/{flag=0}flag' file.in 
ubuntu@ubuntutest:/tmp$

非常感谢任何帮助!!!

最佳答案

您必须使用 -v , 获取shell变量到awk可以通过多种方式完成。有些比其他的要好。

这是最好的方法(请注意在 -v 之后使用空格,否则会降低便携性。例如, awk -v var= 而不是 awk -vvar )

# your shell variables
marker1="###___showhost___###"
marker2="###___showhostset___###"

# and passing them to awk
awk -v market1="$market1" -v market2="$market2" '
$0 ~ "^"market1{found=1;next}
$0 ~ "^"market2{found=0}found' file.in

示例:
akshay@db-3325:~$ foo="this is my shell variable"
akshay@db-3325:~$ awk -v myvar="$foo" 'BEGIN{print myvar}'
this is my shell variable

关于awk - 如何将 BASH shell 变量传递到 AWK 语句中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42814380/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com