2

我想从文件中读取/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找到我上面描述的模式?

4

3 回答 3

1

你在寻找这样的东西吗

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

即标记之间的打印行(包括)?

要删除包含#空行或仅包含空格的行,请使用

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

                              space and a tab--^

更新

如果空行只是空行(no ws),则上面可以缩短为

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

更新2

要检查模式tags {...是否存在于文件中,请使用

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

上面的tr部分删除了所有的换行符,即将所有内容都放在一行中(如果文件不是很大的话会很好用),然后搜索tags模式并输出所有匹配项。

grep 的返回码将0是找到模式,1如果没有。返回码存储在变量中$?。或通过管道将上述内容传递wc -l给以获取找到的匹配项数。

更新3

tags { hosttags=1 }用于在任何地方搜索任意数量的 ws 的正则表达式

'tags\s*{\s*hosttags\s*=\s*1*[^}]*}'
于 2013-03-12T15:11:24.970 回答
0

试试这一行:

 awk '/^\s*#|^\s*$/{next}1' /etc/lvm/lvm.conf
于 2013-03-12T15:16:23.947 回答
0

可以尝试先对文件进行预处理,删除注释和空行,并在右花括号后面引入空行,以便使用第二个 awk 轻松处理。

awk 'NF && $1!~/^#/{print; if(/}/) print x}' file | awk '/pattern/' RS=
于 2013-03-12T16:00:34.567 回答