1. 应用场景
在 linux 下有时在处理配置文件是,需要对一个文本块进行处理,此时使用 awk 的强大功能。文本块的格式是如下:
[section1]
tag1 = value_a
tag2 = value_b
tag3 = value_c
[section 2]
tag4 = {
subtag1 = subtag_value_a
subtag2 = subtag_value_b
subtag3 = subtag_value_c
}
[section 3]
tag6 = {
subtag1 = subtag_value_a
subtag2 = subtag_value_b
}
现在有个需求,需要在[section 2] 这个文本块加入tag5={key=vaule}( 类似于tag4 的格式) 这种形式的属性。当然还需要对其进行修改和删除。下面就是示范使用awk 来进行处理。
1.1. 增加
假设现在要进行添加操作,首先必须要检查tag5 这个文本块是否存在,如果不存在就添加。awk 编程如下:
awk –v TAGVALUE1=vaule_a –v TAGVALUE2=vaule_b '{ if ($0 ~ /^/[section 3/]$) print "tag5 = {/nsubtag1= " TAGVALUE1 "/nsubtag2= " TAGVALUE2 "/n} " print #其他保持不变 }' a.conf
结果如下:
[root@local~]#cat a.conf ·
…
[section 2]
tag4 = {
subtag1 = subtag_value_a
subtag2 = subtag_value_b
subtag3 = subtag_value_c
}
tag5 = {
subtag1 = value_a
subtag2 = value_b
}
[section 3]
tag6 = {
subtag1 = subtag_value_a
subtag2 = subtag_value_b
}
1.2. 修改
假设现在要进行修改操作( 把tag5 中的 subtag2 的值修改为 vaule_bb ) ,首先必须要检查tag5 这个文本块是否存在,如果存在就修改。awk 编程如下:
awk –v TAGVALUE2=vaule_bb '{ if ($1== tag5) { #找到tag5这个文本块 do{ getline; #得到$0 if ($1 == "subtag2"){ print "subtag2 = " TAGVALUE2 continue } print $0 #其他保持不变 }while($1 != "}") } print $0 # 其他保持不变 } ' a.conf
结果如下:
…
[section 2]
tag4 = {
subtag1 = subtag_value_a
subtag2 = subtag_value_b
subtag3 = subtag_value_c
}
tag5 = {
subtag1 = value_a
subtag2 = value_bb
}
[section 3]
tag6 = {
subtag1 = subtag_value_a
subtag2 = subtag_value_b
}
1.3. 删除
假设现在要进行删除操作( 把tag5 这个文本块删除 ) ,首先必须要检查tag5 这个文本块是否存在,如果存在就删除。awk 编程如下:
awk '{ if ($1== tag5) { #找到tag5这个文本块 do{ getline; #得到$0 }while($1 != "}") #删除该块 } else print $0 # 其他保持不变 }' a.conf
结果如下:
…
[section 2]
tag4 = {
subtag1 = subtag_value_a
subtag2 = subtag_value_b
subtag3 = subtag_value_c
}
[section 3]
tag6 = {
subtag1 = subtag_value_a
subtag2 = subtag_value_b
}