2014-10-03 44 views
2

說我有用以下文本文件:使用grep或類似匹配多個線

Line1 
Cmd1 
Cmd2 
Cmd3 
# 
Line2 
Cmd1 
Cmd3 
Cmd4 
# 

凡線路1是一個部分,後跟數字CONFIGS的其可以是部分之間不同,然後一#分隔每個部分。

我明白,我可以用grep如下:

grep 'cmd2' file 

在文件中匹配CMD2。但是,如果它在Line1部分中,我只想匹配cmd2。使用-B是不可能的,因爲節之間可能有不同數量的配置。

謝謝。

回答

3

您可以使用此awk自定義RS

awk -v RS=# -v ORS= '/Line1/ && /Cmd2/' file 
Line1 
Cmd1 
Cmd2 
Cmd3 
+0

完美!無論如何打印當前輸入文件名與輸出,而不僅僅是輸出本身。我找到了{print FILENAME},然而這只是打印文件名。 – DJDMorrison 2014-10-03 20:47:08

+0

當然你可以使用:'awk -v RS =#-v ORS ='/ Line1/&&/Cmd2/{print FILENAME「::」$ 0}'文件' – anubhava 2014-10-03 20:48:36

+1

謝謝anubhava! – DJDMorrison 2014-10-03 20:50:29

0

/s標誌,您可以跨行匹配,所以也許你正在尋找的東西像

if ($line =~ /line1.*?cmd2/is) { 
    # do something here 
} 

我加/i,使匹配情況也不敏感。