awk:擅长统计分析文件内容,对文件中的列进行操作
作用特点
- 排除信息
- 查询信息
- 统计信息
- 替换信息
语法格式
awk [参数] '模式-动作' 文件
替换格式
gsub(/需要替换的信息/,"修改成什么信息",对第几列进行修改)
总结:awk命令中$符号的用法
- $1,$2:取第1列信息和第二列信息
- $NF:取最后一列
- $(NF-1):取倒数第二列
- $0:取所有列信息
查询
-
按照行号查询信息
#查询第二行数据 awk 'NR==2' 1.txt #查询第二行到第四行数据 awk 'NR==2,NR==4' 1.txt #查询第二行和第四行数据 awk 'NR==2;NR==4' 1.txt
-
按照字符查询信息
#查询某字符数据 awk '/old/' 1.txt #查询两个字符之间的数据 awk '/old/,/boy/' 1.txt #查询两个字符的数据 awk '/old/;/boy/' 1.txt #不区分大小写 [root@pert ~]# awk '/a/' IGNORECASE=1 1.txt as Ae
-
显示查询结果的某列
#查询old行然后取出第一列和第三列,中间以空格隔开 awk '/old/{print $1,$3}' 1.txt #查询old行然后取出第一列和第三列,中间以逗号隔开 awk '/old/{print $1","$3}' 1.txt
-
修改以什么为分隔
awk '/old/{print $NF}' 1.txt | awk -F ":" '{print $3}' $NF:最后一列 $(NF-1):倒数第二列 $NF-1:最后一列的值-1 -F:修改以什么为分隔列 组合结果,直接以:为分隔 awk -F ":" '/old/{print $3}' 1.txt
-
添加间隔符号,并展示多列
awk -F "[ :]+" '/old/{print $1,$4}' [ :]+:以空格或者:为分隔,有个+表示就算有多个空格也算一个,这里修改后间隔符有空格、:、空格:三种
-
先找出第三行数据,然后根据第三行的数据找出以41开头的,然后要这些的第一列和第二列的数据
awk '$3~/^41/{print $1,$2}' 1.txt ~:这里后面写找出第几列后这列的匹配规则规则
-
先找出第三列,然后根据第三列数据找出以1或5结尾的数据然后要第一列和第二列数据并且结果对齐显示
awk '$3~/1$|5$/{print $1,$2}' 1.txt | column -5 column -t:显示结果列对齐
-
先找出数据然后修改找出的内容,只是在显示上进行修改
awk '$2~/old/{gsub(/:/,"$",$NF);print $NF}'
文件中空行或注释进行排除
-
grep
grep -Ev "^#|^$" 1.txt
-
sed
sed -rn '/^#|^$/d' 1.txt
-
awk
awk '$0!~/^#|^$/' 1.txt
awk高级功能说明
- 对日志信息进行统计(计数)
- 对日志信息数值进行求和。客户端-下载、服务端-上传,都需要消耗网络流量
- 数组进行排序分析
- 进行脚本编写循环语句、判断语句
awk模式概念说明:匹配的条件信息
-
普通模式
- 正则表达式
- /^old/
- 利用比较匹配信息
- 第二行:NR==2
- 第二行后:NR>2
- 第二行前包含第二行:NR<=2
- 第二行和第四行:NR2;NR4
- 第二行到第四行:NR2,NR4
- 正则表达式
-
特殊模式
-
BEGIN{}:在awk执行命令前做什么事情
awk 'BEGIN{print "姓名","QQ号","捐款记录"}{print $0}' 1.txt | column -t
-
end{}:在awk执行命令后做什么事情
awk 'BEGIN{print "姓名","QQ号","捐款记录"}{print $0}END{print "操作结束"}' 1.txt | column -t
-
BEGIN
-
用于计算
awk 'BEGIN{print 100+22}'
-
修改内置变量
-
FS作用==-F
awk -F ":" '{print $2}' 1.txt 等同于 awk 'BEGIN{FS=':'}{print $2}' 1.txt 等同于-vFS=':'
-
利用awk公式进行计数运算
i=0
echo $((i=i+1))
或者
echo $(i++)
#统计这个文件中有多少空行
i=0
awk '/^$/{i++;print i}' /etc/services
只显示最后一行结果
awk '/^$/{i++}END{print i}' /etc/services
统计系统中有多少个虚拟用户 普通用户
-
用户信息都保存在什么文件中
- /etc/passwd
-
从文件中匹配出虚拟用户、普通用户
-
普通用户
awk '$NF~/\/bin\/bash/' /etc/passwd
-
虚拟用户
awk '$NF!~/\/bin\/bash/' /etc/passwd
-
-
进行统计
awk 'BEGIN{i=0}$NF~/\/bin\/bash/{i++}END{print i}' /etc/passwd 等价于 可以不用提前设置i awk '$NF~/\/bin\/bash/{i++}END{print i}' /etc/passwd
-
求和运算
seq 10 | awk '{sum=sum+$1;print sum}' 1 3 6 10 15 21 28 36 45 55 [root@pert ~]# cat 1.txt a 1 :1:2:3 b 2 :11:22:33 [root@pert ~]# awk -F "[ :]+" 'BEGIN{print "第一次总额","第二次总额"}{sum=sum+$3;sum2=sum2+$4}END{print sum,sum2}' 1.txt | column -t 第一次总额 第二次总额 12 24