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

时间:2017-03-15 15:39:34

标签: awk

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

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

该脚本将从文本文件中提取不同字符串/标记($ marker1和$ marker2)之间的所有文本行 - file.in

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$

任何帮助都非常感谢!!!

2 个答案:

答案 0 :(得分:3)

您必须使用-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

答案 1 :(得分:0)

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

$ marker1=###___showhost___###

$ echo $marker1
###___showhost___###

$ awk 'BEGIN { marker1 = ARGV[1] ; print marker1 }' $marker1
###___showhost___###

我对所有这些哈希标记(#)有点怀疑,因为它们在bash脚本中启动注释,但在命令行上似乎不是问题。

编辑:

这也是awk中的一个问题。 Akshay Hedge的答案以一种简单的方式解决了这个问题。