01.课程介绍部分
1.掌握awk命令基础用法
2.掌握awk命令扩展功能 统计 运算功能
了解awk数组部分 shell数组 (一起讲)
02.昨日知识
1.sed命令作用 语法:sed [参数] '条件 指令' 文件
2.sed命令实操
①查询数据信息 sed -n '/查什么/p ' 文件信息
②添加数据信息 sed -i.bak '在哪添加 i/a添加的内容' 文件信息
③删除数据信息 sed -ri.bak '/条件01|条件01/d' 文件信息
④替换数据信息 sed -i.bak 's#要替换#替换成#g' 文件信息
sed -ri.bak 's#要替换的信息(保留信息)#替换的信息\1#g' 文件信息
sed -ri.bak 's#正则匹配信息#&(前面的信息)#g'文件信息
sed -i.bak '3c 改成什么' 文件信息 ---第三行全部替换
一.sed命令练习题
1.利用sed命令取出ip地址
2.利用sed命令批量创建用户
3.利用sed命令取出文件权限
4.利用sed命令批量修改文件扩展名
5.利用sed命令编写脚本
修改服务器IP地址信息脚本
03.三剑客命令awk概述
man awk详情:gawk - pattern scanning and processing language
可以进行模式扫描 和 一门语言
命令使用格式: awk [参数] '模式{动作}' 文件 (擅长列进行处理)
与sed对比: sed [参数] '条件 指令' 文件 (擅长对文件内容的行进行处理)
原理: 如图:
33 awk原理.png
04.三剑客命令awk作用
处理文件信息: 文本文件
擅长处理日志
配置文件
处理文件方式: 排除 查询 统计 替换
擅长对文件的列进行处理
05.awk命令的操作
创建测试环境
# cat reg.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
1.显示Xiaoyu的姓氏和ID号
第一步:获取xiaoyu信息
awk '/Xiaoyu/' reg.txt ---不管哪里有xiaoyu都会显示
awk '$2~/Xiaoyu/' reg.txt ---只找第二列有xiaoyu的
第二步:满足条件显示第三列与第一列
awk '$2~/Xiaoyu/{print $1 $2}' reg.txt ---中间不会有空格
awk '$2~/Xiaoyu/{print $1,$2}' reg.txt ---,代表空格或 " "双引号表示空格
2.姓氏是zhang的人,显示他的第二次捐款金额以及他的名字
第一步:找出需要编写模式
awk '$1~/Zhang/' reg.txt ---姓氏为zhang的找出来
第二步:
# awk '$1~/Zhang/{print $1,$2,$4}' reg.txt ---姓氏 名字 三次捐款金额
Zhang Dandan :250:100:175
Zhang Xiaoyu :155:90:201
# awk -F "[: ]+" '$1~/Zhang/{print $1,$2,$5}' reg.txt
---[: ]以: 都为分隔符,将多个分隔符合并为整体使用正则符号 +
Zhang Dandan 100
Zhang Xiaoyu 90
ps:awk默认以空格为分隔符,如果想用其他分隔符 参数-F "[以什么为分隔符]+" [] +都为正则符号应用
3.显示所有以41开头的ID号码的人的全名和ID号码
第一步:先找出模式 以41开头的
awk '$3~/^41/' reg.txt ---以41kait
第二步:根据条件
awk '$3~/^41/{print $1,$2,$3}'
4.显示所有ID号码最后一位数字是1或者5的人的全名
第一步:先找出模式 以1或5结尾的
awk '$3~/1$|5$/' reg.txt ---利用正则 |
awk '$3~/[15]$/' reg.txt ---利用正则 []
第二步:根据条件
awk '$3~/[15]$/{print $1,$2}' reg.txt
5.获取文件中有井号或空行的内容,将空行和井号信息的行排除
第一步:先找出模式,有井号或空行内容
awk '/#|^$/' reg.txt
awk '$0~/#|^$/' reg.txt
注意:$0表示将文件所有列显示 默认也显示所有列
第二步:按要求取反并显示出来
awk '!/#|^$/' reg.txt
awk '$0!~/#|^$/{print $0}' reg.txt
注意:{print 0}也可以不加 默认显示所有
6. 显示Xiaoyu的捐款,每个捐款数额都是以$开头, 如$110$220$330
第一种:# awk -F "[: ]+" '$2~/Xiaoyu/{print "$"$4,"$"$5,"$"$6}' reg.txt
$155 $90 $201 ---利用 ,与" "相同原理" "中为$就可以替换
第二种:# awk '$2~/Xiaoyu/{print $4}' reg.txt|sed 's#:#$#g'
$155$90$201 ---利用sed s###g
第三种:# awk '$2~/Xiaoyu/{print $4}' reg.txt|tr ':' '$'
$155$90$201 ---利用tr 替换
第四种:# awk '$2~/Xiaoyu/{gsub(/:/,"$",$4);print $4}' reg.txt
$155$90$201 ---利用gusb
awk替换
gsub = gawk substitute
使用格式:gusb(/要替换的信息/,"替换成什么",$将第几列)
第一步:
# awk '$2~/Xiaoyu/{gsub(/:/,"$",$4);print $4}' reg.txt
$155$90$20 ----第六题替换方法:
说明:$NF 表示文件的最后一列信息
06.awk命令模式分类
普通模式:比较行信息 例:
# awk 'NR<2' reg.txt ---显示第二行上面的所有行信息
Zhang Dandan 41117397 :250:100:175
# awk 'NR>2' reg.txt ---显示第二行下面的所有行信息
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
# awk 'NR==2' reg.txt ---显示第二行信息
Zhang Xiaoyu 390320151 :155:90:201
说明:NR 表示文件行信息
取出多行内容 例:
# awk 'NR==3,NR==5' reg.txt ---,隔开表示取3-5行信息
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
# awk 'NR==3;NR==5' reg.txt ---;隔开表示取3和5行信息
Meng Feixue 80042789 :250:60:50
Liu Bingbing 41117483 :250:100:175
特殊模式:
BEGIN{动作}:在处理文件之前,先做什么事情 例:
# awk 'BEGIN{print"姓","名","ID号","捐款记录"}{print $0}' reg.txt|column -t
姓 名 ID号 捐款记录
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
column -t用于对齐
用于计算(+-*/^%) 例:
# awk 'BEGIN{print 3+3}'
6
# awk 'BEGIN{print 3-3}'
0
# awk 'BEGIN{print 3*3}'
9
# awk 'BEGIN{print 3/3}'
1
# awk 'BEGIN{print 3^3}'
27
# awk 'BEGIN{print 5%3}'
2
修改内置变量:
NF: 取出最后一列
# awk '{print $(NF-1)}' reg.txt ---取出倒数第二列
NR: 表示行信息
FS: 指定列分隔符,默认识别空格为分隔符
# awk 'BEGIN{FS="[: ]+"}{print $4}' reg.txt
# awk -vFS="[: ]+" '{print $1,$4}' reg.txt
END{动作}:在处理文件之后,先做什么事情
# awk 'BEGIN{print "姓","名","号码","捐款记录"}{print $0}END{print "学生捐款登记表"}' reg.txt|column -t
姓 名 号码 捐款记录
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
学生捐款登记表
注意:格式要求 BEGIN{ }{匹配内容}END{ }
应用:将统计后的最终结果进行输出
07.awk统计运算公式
a 文本信息累加运算
公式:i=i+1
统计文件行数
# awk '{i=i+1}END{print i}' reg.txt
# awk '/oldboy/{i++}END{print i}' reg.txt
4
b 数值信息求和运算
公式:sum=sum+$n $n代表要对文件第几列做求和运算
例:
# seq 10|awk '{sum=sum+$1}END{print sum}'
55
练习:找出secure日志中的faild信息,共出现多少次
Windows文件传输到linux系统
yum install -y lrzsz ---实现数据传输功能
rz ---将Windows数据传到linux系统
sz ---将linux数据传到Windows系统
方法一:awk '/Failed/{i++}END{print i}' secure-20161219
方法二:awk '$6~/Failed/{i++}END{print i}' secure-20161219'
08.知识梳理:
1.awk命令概念介绍: 语法结构 原理:BEGIN 处理文件 END
2.awk命令操作: 作用 查询 排除 替换
参数:
-F :指定列分割符号
-v :指定变量信息
动作:
print:输出指定信息
gsub :替换指定信息
符号:
~ :匹配信息 按照执行列进行匹配
!~:将匹配的信息取反
//:指定匹配信息
3.awk命令模式分类
BEGIN{}:处理文件前,执行什么动作
END{} :处理文件后,执行什么动作
内置变量有:FS NF NR $0(表示全部)
4.awk命令实现运算功能
累加公式:i=i+1 或 i++
求和运算:sum=sum+$n
作业:
01. 如何完成求差运算
公司 运营总金额 10000
张三 采购电脑花费 1000
李四 采购办公用品 250
王五 采购食品 330
公司运营金额还剩多少
第一种:# awk '$3!~/10000/{print $3}' est.txt|awk 'BEGIN{sum=10000}{sum=sum-$0}END{print sum}'
第二种:# awk 'BEGIN{sum=10000}''$3!~/10000/{sum=sum-$3}END{print sum}' est.txt
02. 统计每一个失败IP地址次数, 进行排序显示,取出前3名
shell--awk数组