awk笔记231129

awk的脚本套路是:
awk的脚步部分最好用一对单引号将
‘BEGIN{} /pattern1/{}…/patternN/{} END{}’ 套起来,
因为常用到$号, $号在单引号中不会被转义, 在双引号中有取值的含义

awk -F '自定义分隔符' `BEGIN{开始块}
/pattern1/{操作pattern1过滤的行的块}
/pattern2/{操作pattern2过滤的行的块}
...
/patternN/{操作patternN过滤的行的块}
END{结束块}

-F指定分隔符,可以没有,默认是空格
BEGIN{开始块}可以没有
END{结束块}可以没有
BEGIN,END 必须全大写,否则不起效

echo "1 aaa aaa aaa
2 aaa aaa aaa
3 aaa aaa aaa
4 aaa aaa aaa
5 aaa aaa aaa
6 aaa aaa aaa
7 aaa aaa aaa"  | awk   '/[135]/{sub("aaa","b&b",$0);  print $0}'

结果

1 baaab aaa aaa
3 baaab aaa aaa
5 baaab aaa aaa

与上面的区别只是 sub改为gsub

echo "1 aaa aaa aaa
2 aaa aaa aaa
3 aaa aaa aaa
4 aaa aaa aaa
5 aaa aaa aaa
6 aaa aaa aaa
7 aaa aaa aaa"  | awk   '/[135]/{gsub("aaa","b&b",$0);  print $0}'

结果:

1 baaab baaab baaab
3 baaab baaab baaab
5 baaab baaab baaab

原样实例

[z@fedora root]$ echo "1 aaa aaa aaa
2 aaa aaa aaa
3 aaa aaa aaa
4 aaa aaa aaa
5 aaa aaa aaa
6 aaa aaa aaa
7 aaa aaa aaa"  | awk   '/[135]/{sub("aaa","b&b",$0);  print $0}'
1 baaab aaa aaa
3 baaab aaa aaa
5 baaab aaa aaa
[z@fedora root]$ echo "1 aaa aaa aaa
2 aaa aaa aaa
3 aaa aaa aaa
4 aaa aaa aaa
5 aaa aaa aaa
6 aaa aaa aaa
7 aaa aaa aaa"  | awk   '/[135]/{gsub("aaa","b&b",$0);  print $0}'
1 baaab baaab baaab
3 baaab baaab baaab
5 baaab baaab baaab

讲解

# /[135]/ 筛选出含1,3,5的行
# sub和gub是替换函数, sub替换每行的第一个匹配, gsub替换每行的所有匹配
# b&b表示给匹配的结果左右加上b字母, &代表匹配的字段
awk   '/[135]/{sub("aaa","b&b",$0);  print $0}'
awk   '/[135]/{gsub("aaa","b&b",$0);  print $0}'



例2
echo "0 aaa aaa aaa
1 aaa aaa aaa
2 aaa aaa aaa
3 aaa aaa aaa
4 aaa aaa aaa
5 aaa aaa aaa
6 aaa aaa aaa
7 aaa aaa aaa
8 aaa aaa aaa
9 aaa aaa aaa"  | 
awk   'BEGIN{print "这是开始块"  } /[135]/{gsub("aaa","b&b",$0);  print $0} /[234]/{print $0} END{print "这是结束块" }'

上下是一样的,单双引号未结束时可换行, 管道符|后可换行

echo "0 aaa aaa aaa
1 aaa aaa aaa
2 aaa aaa aaa
3 aaa aaa aaa
4 aaa aaa aaa
5 aaa aaa aaa
6 aaa aaa aaa
7 aaa aaa aaa
8 aaa aaa aaa
9 aaa aaa aaa"  | 
awk   'BEGIN{print "这是开始块"        } 
/[135]/{gsub("aaa","b&b",$0);  print $0} 
/[234]/{print $0                       } 
END{print "这是结束块"                 }'

结果

这是开始块
1 baaab baaab baaab
2 aaa aaa aaa
3 baaab baaab baaab
3 baaab baaab baaab
4 aaa aaa aaa
5 baaab baaab baaab
这是结束块

控制台原样

[z@fedora root]$ echo "0 aaa aaa aaa
1 aaa aaa aaa
2 aaa aaa aaa
3 aaa aaa aaa
4 aaa aaa aaa
5 aaa aaa aaa
6 aaa aaa aaa
7 aaa aaa aaa
8 aaa aaa aaa
9 aaa aaa aaa"  |
awk   'BEGIN{print "这是开始块"        }
/[135]/{gsub("aaa","b&b",$0);  print $0}
/[234]/{print $0                       }
END{print "这是结束块"                 }'
这是开始块
1 baaab baaab baaab
2 aaa aaa aaa
3 baaab baaab baaab
3 baaab baaab baaab
4 aaa aaa aaa
5 baaab baaab baaab
这是结束块

可看出, 第三个块输入的数据会受第二个块的影响
第三块筛选包含2,3,4的行,第二块筛选包含1,3,5的行,
第3行是共选,所以出现两次,被第二块改了,第三块什么都不做,输出第二块的修改的样子
第2,4行没有被第二块筛选,保持原态,被第三块筛选输出.

例3
echo "0 aaa aaa aaa
1 aaa aaa aaa
2 aaa aaa aaa
3 aaa aaa aaa
4 aaa aaa aaa
5 aaa aaa aaa
6 aaa aaa aaa
7 aaa aaa aaa
8 aaa aaa aaa
9 aaa aaa aaa"  | 
awk   'BEGIN{print "这是开始块"               } 
/[135]/{gsub("aaa","b&b",$0);  print $0       } 
/[234]/{print $0                              } 
/[1579]/{sub("aaa","1579&1579",$0);  print $0 } 
END{print "这是结束块"                        }'

结果

这是开始块
1 baaab baaab baaab
1 b1579aaa1579b baaab baaab
2 aaa aaa aaa
3 baaab baaab baaab
3 baaab baaab baaab
4 aaa aaa aaa
5 baaab baaab baaab
5 b1579aaa1579b baaab baaab
7 1579aaa1579 aaa aaa
9 1579aaa1579 aaa aaa
这是结束块

控制台原样

[z@fedora root]$ echo "0 aaa aaa aaa
1 aaa aaa aaa
2 aaa aaa aaa
3 aaa aaa aaa
4 aaa aaa aaa
5 aaa aaa aaa
6 aaa aaa aaa
7 aaa aaa aaa
8 aaa aaa aaa
9 aaa aaa aaa"  |
awk   'BEGIN{print "这是开始块"               }
/[135]/{gsub("aaa","b&b",$0);  print $0       }
/[234]/{print $0                              }
/[1579]/{sub("aaa","1579&1579",$0);  print $0 }
END{print "这是结束块"                        }'
这是开始块
1 baaab baaab baaab
1 b1579aaa1579b baaab baaab
2 aaa aaa aaa
3 baaab baaab baaab
3 baaab baaab baaab
4 aaa aaa aaa
5 baaab baaab baaab
5 b1579aaa1579b baaab baaab
7 1579aaa1579 aaa aaa
9 1579aaa1579 aaa aaa
这是结束块




发现菜鸟教程的解释挺好的,和我理解的一样 点击跳转 AWK 工作原理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kfepiza

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值