我想从文件/etc/lvm/lvm.conf
中读取并检查可能跨越多行的以下模式。
tags {
hosttags = 1
}
tags
和{
,{
和hosttags
之间可能有多个空格,依此类推。同样{
可以在下一行跟随tags
,而不是与它在同一行。
我打算使用awk
和sed
来执行此操作。
在阅读文件lvm.conf
时,它应该跳过空行和注释。
我正在使用。
data=$(awk < cat `cat /etc/lvm/lvm.conf`
/^#/ { next }
/^[[:space:]]*#/ { next }
/^[[:space:]]*$/ { next }
.
.
如何使用sed
查找上述模式?
答案 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=