awk应用于多行编程

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

}

 

 

 

你可能感兴趣的:(编程,c,linux)