awk精讲-从进阶到果断放弃

正则表达式

^ 以…开头
$ 以…结尾
^$ 空行
. 表示任意一个字符
.* 表示所有
[abc] 匹配a或者b或者c
[^ab] 不匹配a或者b 取反
| 或者
() 表示里面内容为一个整体
* 前一个字符连续出现零次或者零次以上
+ 前一个字符出现一次或一次以上
? 出现一次或者零次
a{3,5} >=3 <=5
a{3} ==3
a{3,} >=3
a{,5} <=5

grep

grep 参数

-v: 取反,排除
-o:显示匹配过程
-n:显示行号
-E:使用正则表达式
-r:递归查询,找出一个目录中包含xxx的文件
-l:只显示文件名+路径,多和-r一起用
-c:统计行数
-i:忽略,不区分大小写
-w:按照单词进行匹配
-A:-after

sed

使用方式

sed -n ‘3p’ liu.txt :显示第三行
sed -n ‘1,3p’ liu.txt :显示第一行到第三行
sed -n ‘/liulaoliu/p’ liu.txt :显示包含liulaoliu的行
sed -n ‘/{/,/}/p’ liu.txt :显示花括号以内的行

awk

参数

-F:指定分隔符
-v:修改内置变量
-vOFS=; :修改显示出的分隔符为;

用法

awk ‘/{/,/}/{if(/liulao/)print}’ cshi.log
#显示{}里面的liulao,并使用if进行判断
awk ‘/liulao/’ cshi.log
#匹配包含liulao的行
awk -F: ‘$5==“root”’ /etc/passwd
#匹配第五列等于root的行,awk里面如果不加引号,则将其视为一个变量
awk ‘{sum[$1]=sum[$1]+$10}END{for(i in sum)print sum[i],i}’ access.log |sort -rn|head
#统计nginx日志文件每个IP地址使用的流量
awk ‘{sum[$1]=sum[$1]+1}END{for(i in sum)print sum[i],i}’ access.log |sort -rn|head
#统计每个IP地址出现的次数

FIELDWIDTHS
[root@liulao ~]# echo "20190325"
20190325
[root@liulao ~]# echo "20190325"|awk -vFIELDWIDTHS="4 2 2" '{print $1,$2,$3}'
2019 03 25
.##

awk ‘$NF~/bash/’ /etc/passwd
#/etc/passwd下最后一列以bash结尾的
awk ‘/{/,/}/ {if(/liu/)i++} END{print i}’ cshi.log
#统计文件{}中liu出现的次数
awk ‘{sum=sum+$9} END{print sum}’ access.log
#计算nginx访问日志中流量总数
awk ‘{sum=sum+$9} END{print sum/1024^3}’ access.log
#折算成以GB为单位

你可能感兴趣的:(shell脚本)