2013-03-12 78 views
2

我想從文件/etc/lvm/lvm.conf中讀取並檢查可能跨越多行的下列圖案。使用awk和sed搜索特定多行圖案

tags { 
hosttags = 1 
} 

有可能是tags{{hosttags等之間儘可能多的空格。另外{可以在下一行跟隨tags,而不是與它在同一行。

我打算使用awksed來做到這一點。

讀取文件lvm.conf時,應該跳過空行和註釋。

我正在使用。

data=$(awk < cat `cat /etc/lvm/lvm.conf`    
/^#/  { next }      
/^[[:space:]]*#/   { next }     
/^[[:space:]]*$/   { next }     
.   
.        

如何使用sed找到上述的模式?

回答

1

你在尋找類似的標記之間的這種

sed -n '/{/,/}/p' input 

即打印線(含)?

含有#和空行或只含有空格的線要刪除的線,使用

sed -n '/{/,/}/p' input | sed '/#/d' | sed '/^[ ]*$/d' 

           space and a tab--^ 

更新

如果空行只是空行(無WS),上面可以縮短到

sed -e '/#/d' -e '/^$/d' input 

UPDATE2

要檢查模式tags {...存在於文件中,使用

$ tr -d '\n' < input | grep -o 'tags\s*{[^}]*}' 
tags { hosttags = 1# this is a comment} 

以上tr部分刪除所有換行符,即讓一切成一個單一的線路(將工作的偉大,如果該文件是不是大),然後搜索tags模式並輸出所有匹配。

從grep返回的代碼將是0是模式被發現,1如果沒有。 返回碼存儲在變量$?中。或者將上述內容輸入wc -l以獲得找到的匹配數量。

UPDATE3

正則表達式與任意數量的WS的任何地方

'tags\s*{\s*hosttags\s*=\s*1*[^}]*}' 
+0

它似乎是op想要跳過評論 – Kent 2013-03-12 15:15:02

+0

這個偉大的sed'/#/ d'| sed'/^[] * $/d'..但我想要的是搜索模式..不只是打印它..還請注意,該模式可以有空格之間.. – user2161443 2013-03-12 15:42:49

+0

@ user2161443 - 你需要一種判斷文件中是否有「tags {...}」的方法? – 2013-03-12 16:02:33

0

嘗試這條線searcing爲tags { hosttags=1 }

awk '/^\s*#|^\s*$/{next}1' /etc/lvm/lvm.conf 
+0

看起來不錯,但是隻在括號內顯示圖案呢? – 2013-03-12 15:22:15

+0

@FredrikPihl爲什麼?沒有這些信息,人們無法理解conf文件。 OP沒有要求它... – Kent 2013-03-12 15:26:00

+0

無視我的意見,你是對的 – 2013-03-12 15:27:06

0

一個可以嘗試先預處理文件,刪除commments和空行,並在最後一個花括號後面引入空行,以便與secon輕鬆處理d awk。

awk 'NF && $1!~/^#/{print; if(/}/) print x}' file | awk '/pattern/' RS=