我想将 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)
任何帮助非常感谢!
您必须使用,可以通过多种方式-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)