2017-03-15 66 views
0

我想将2个shell(bash)变量传递给awk语句。 在这个例子中,变量是MARKER1和MARKER2如何将BASH shell变量传递到AWK语句

[email protected]:/tmp$ echo $marker1 
###___showhost___### 
[email protected]:/tmp$ echo $marker2 
###___showhostset___### 
[email protected]:/tmp$ 

该脚本将提取到的文本文件不同的字符串/标志($ MARKER1和$ MARKER2)之间的文本的所有行 - file.in

[email protected]:/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 
[email protected]:/tmp$ 

如果我运行awk的语句,其中我用实际的字符串变量值MARKER1/MARKER2 ### ___ ___ showhost命令###### ___ ___ showhostset ###分别而不是使用变量本身的(内awk)我得到一个positiv e结果。但是,我想将awk语句放在bash脚本中,并且需要读取变量marker1/marker2。

[email protected]:/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 
[email protected]:/tmp$ 

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

[email protected]:/tmp$ awk '/^"'$marker1'"/{flag=1;next}/^"'$marker2'"/{flag=0}flag' file.in 
[email protected]:/tmp$ 

任何帮助,不胜感激!

+0

阅读手册页和/或手册可以很快得到这些信息 – grail

回答

0

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

$ marker1=###___showhost___### 

$ echo $marker1 
###___showhost___### 

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

我是有点怀疑,所有这些hashmarks(#),因为他们开始在bash脚本中的注释,但似乎没有在命令中的问题线。

编辑:

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

2

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

例子:

[email protected]:~$ foo="this is my shell variable" 
[email protected]:~$ awk -v myvar="$foo" 'BEGIN{print myvar}' 
this is my shell variable 
+0

谢谢Akshay,那就是为我工作。 awk语句与原始语句略有不同,您现在可以解释它是如何工作的(提取变量market1和market2之间的文本)。谢谢 – vtecdec

+0

@vtecdec:我只是将'flag'改为'found'以获得更好的可读性。rest all all,'$ 0'表示当前记录/行/行,'$ 0〜'^“marker1 {}'表示记录是否以值然后让marker1变量为'found = 1',然后转到下一行,对于market2使'found = 0'和'} found'一样,只要'found'不为零,然后打印当前记录/行/行 –