2017-03-15 64 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'不爲零,然後打印當前記錄/行/行 –