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

vte*_*dec 5 bash awk

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

ubuntu@ubuntutest:/tmp$ echo $marker1
###___showhost___###
ubuntu@ubuntutest:/tmp$ echo $marker2
###___showhostset___###
ubuntu@ubuntutest:/tmp$
Run Code Online (Sandbox Code Playgroud)

该脚本将从文本文件 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$
Run Code Online (Sandbox Code Playgroud)

如果我运行 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$
Run Code Online (Sandbox Code Playgroud)

但是,当我在 awk 语句中使用 2 个变量 $marker1 和 $marker2 时,我没有得到任何输出。

ubuntu@ubuntutest:/tmp$ awk '/^"'$marker1'"/{flag=1;next}/^"'$marker2'"/{flag=0}flag' file.in 
ubuntu@ubuntutest:/tmp$
Run Code Online (Sandbox Code Playgroud)

任何帮助非常感谢!

Aks*_*gde 8

您必须使用,可以通过多种方式-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
Run Code Online (Sandbox Code Playgroud)

例子:

akshay@db-3325:~$ foo="this is my shell variable"
akshay@db-3325:~$ awk -v myvar="$foo" 'BEGIN{print myvar}'
this is my shell variable
Run Code Online (Sandbox Code Playgroud)