2014-10-03 57 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,使匹配情况也不敏感。