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

如何将BASH shell变量传递到AWK语句中,awk,Awk,我想将2个shell bash变量从传递到awk语句中。 在本例中,变量为marker1和marker2 ubuntu@ubuntutest:/tmp$ echo $marker1 ###___showhost___### ubuntu@ubuntutest:/tmp$ echo $marker2 ###___showhostset___### ubuntu@ubuntutest:/tmp$ 脚本将从text file-file.in中提取到不同字符串/标记$marker1和$marker2之

我想将2个shell bash变量从传递到awk语句中。 在本例中,变量为marker1和marker2

ubuntu@ubuntutest:/tmp$ echo $marker1
###___showhost___###
ubuntu@ubuntutest:/tmp$ echo $marker2
###___showhostset___###
ubuntu@ubuntutest:/tmp$
脚本将从text file-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\uuuuuuuuu showhost\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。但是,我想将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语句中使用两个变量$marker1和$marker2时,我没有得到任何输出

ubuntu@ubuntutest:/tmp$ awk '/^"'$marker1'"/{flag=1;next}/^"'$marker2'"/{flag=0}flag' file.in 
ubuntu@ubuntutest:/tmp$

非常感谢任何帮助

您可以将命令行参数传递给awk脚本。有一些内置变量可用于访问:

$ marker1=###___showhost___###

$ echo $marker1
###___showhost___###

$ awk 'BEGIN { marker1 = ARGV[1] ; print marker1 }' $marker1
###___showhost___###
我对所有这些hashmark有点怀疑,因为它们在bash脚本中开始注释,但在命令行中似乎不是问题

编辑:

这在awk中也是一个问题。Akshay Hedge的答案以一种简单的方式处理这个问题。

您必须使用-v,将shell变量导入awk可以通过几种方式完成。有些比另一些好

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

例如:


阅读手册和/或手册会很快得到这些信息谢谢Akshay,这对我来说很有用。awk语句与原始语句略有不同,您能否解释一下它是如何在变量market1和market2之间提取文本的。thanks@vtecdec:我刚刚将标志改为found以获得更好的可读性其余都是一样的,$0表示当前记录/行/行,$0~^marker1{}表示如果记录以marker1的值开头,则使变量found=1并转到下一行,market2的方法相同,即使found=0,并且}found where found不为零,然后打印当前记录/行/行
# 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