awk '/AL/ {printf $1; print $2}' emp.txt awk '/AL/{print $1} {print $2}' emp.txt
1.第一种只处理匹配到AL的行; 然后打印这些行的第一字段和第二字段
2.第二种只有在匹配到AL的行才打印字段一,但是字段二是无条件的,始终打印
2.awk内置函数用法如下文本test.log,需要把文本中单位是"M"的字段转换为"G"
16G 16G 1.9G 40G none 4G 4G 952M 60G 16G 16G 1.6G 40G none 5G 780M 5G 80G
若我们单纯地想替换字符串,则可以使用一下命令,注意:print没带默认参数时,默认打印整行记录
cat 1.txt | awk '{
sub(/M/,"G",$i)
print
}'
完整替换如下,替换的同时进行数值计算
cat 1.log | \ awk '{ for(i=1;i<=NF;i++){ if($i ~ /M/) printf int(substr($i,1,match($i,/M/)-1)/1024*100)/100"G\t" else printf $i"\t" } print "" }'
1.使用for遍历每一行的每一个字段,使用if处理匹配到"M"的字段,然后调用awk内置函数int, substr, match处理, 关于awk内置函数,可以参考Linux awk 内置函数详细介绍(实例)
2.先乘100,再除以100,是为了转换为"G"单位后保留两位小数
3.注意 printf,print 两个函数的区别
3.awk条件语句如第二个例子中的文本,现在需要分别统计每行中带有"G", "M", "none" 字段的个数,并输出
cat test.log | \ awk ' BEGIN{OFS="\t"} { a=b=c=0 for(i=1;i<=NF;i++){ if($i ~ /G/) a+=1 else if($i ~ /M/) b+=1 else c+=1 } print $0,"G:"a,"M:"b,"none:"c } END{print "end!"} '
结果如下:
16G 16G 1.9G 40G G:4 M:0 none:0 4G 4G 952M 60G G:3 M:1 none:0 16G 16G 1.6G 40G G:4 M:0 none:0 5G 780M 5G 80G G:3 M:1 none:0 end!
4.awk中break用法给出一个如下文本test2.log,在每一行中,只输出字母及其之前的字符