我想将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$
任何帮助都非常感谢!!!
答案 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的答案以一种简单的方式解决了这个问题。