使用awk和sed搜索特定的多行模式

时间:2013-03-12 15:08:26

标签: sed awk

我想从文件/etc/lvm/lvm.conf中读取并检查可能跨越多行的以下模式。

tags {
 hosttags = 1
} 

tags{{hosttags之间可能有多个空格,依此类推。同样{可以在下一行跟随tags,而不是与它在同一行。

我打算使用awksed来执行此操作。

在阅读文件lvm.conf时,它应该跳过空行和注释。

我正在使用。

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

如何使用sed查找上述模式?

3 个答案:

答案 0 :(得分: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 { hosttags=1 }的正则表达式

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

答案 1 :(得分:0)

试试这一行:

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

答案 2 :(得分:0)

首先可以尝试预处理文件,删除通知和空行,并在结束大括号后面引入空行,以便使用第二个awk轻松处理。

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