2019-06-19
1. awk三剑客命令概述
# which awk--------查看awk在哪个目录下
显示: /usr/bin/awk
# ll /usr/bin/awk
显示: lrwxrwxrwx. 1 root root 4 May 31 16:06 /usr/bin/awk -> gawk ------查看awk更详细的信息
# man awk
显示: gawk - pattern scanning and processing language
解析: 模式扫描(条件匹配)and 程序语言
awk: 擅长取列 擅长统计分析(nginx zabbix tomcat ... SSH)ELK awk
03. awk三剑客命令执行原理
参见示意图
04. awk三件可命令语法结构
awk [参数] '模式(条件){动作}(指令)' 文件信息
05. awk三剑客命令实践操作:查询 排除 替换
部署准备环境
cat > oldboy.txt <<EOF
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
EOF
2. 实践操作练习:
01. 显示xiaoyu的姓氏和ID号码
# awk '/Xiaoyu/{print $1 $3}' oldboy.txt
Zhang390320151
# awk '/Xiaoyu/{print $1,$3}' oldboy.txt
Zhang 390320151
# awk '/Xiaoyu/{print $1" "$3}' oldboy.txt
Zhang 390320151
按照指定列进行搜索信息Xiaoyu 问题是内容中有两个Xiaoyu
# awk '/Xiaoyu/' oldboy.txt --- 将匹配信息的行直接显示
Zhang Xiaoyu 390320151 :155:90:201
Xiaoyu zhang 390320151 :155:90:201
# awk '$2~/Xiaoyu/' oldboy.txt --- 指定列信息匹配 解决方法
Zhang Xiaoyu 390320151 :155:90:201
# awk '$2!~/Xiaoyu/' oldboy.txt ----表示将指定列信息取返
Zhang Dandan 41117397 :250:100:175
Xiaoyu zhang 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
显示xiaoyu的姓氏和ID号:满足要求,正确语法格式
# awk '$2~/Xiaoyu/{print $1,$3}' oldboy.txt
Zhang 390320151
PS:awk命令默认区分大小写不需要加i 没有类似grep命令 -i参数功能
02.姓氏是zhang的人,显示他的第二次捐款金额及他的名字
第一历程:找出姓氏是张的人
# awk '$1~/Zhang/' oldboy.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
第二历程:显示出名字信息 和所有捐款记录
# awk '$1~/Zhang/{print $2,$4}' oldboy.txt
Dandan :250:100:175
Xiaoyu :155:90:201
PS:在使用-F的参数下,awk默认使用空格进行作为列分隔符
第三历程:指定字符信息作为分隔符
# awk -F "[: ]+" '$1~/Zhang/{print $2,$5}' oldboy.txt
Dandan 100
Xiaoyu 90
总结:
01. awk默认使用空格分隔列
02. 可以使用-F 指定分隔列的符号信息
03. 利用-F "[: ]+" +表示将多个连续的分隔符汇总为一个整体
03. 显示所有以41开头的ID号码的人的全名和ID号码
第一个历程:找出匹配id号码是41开头的行信息 --- 找出东西(模式写好)
# awk '$3~/^41/' oldboy.txt
Zhang Dandan 41117397 :250:100:175
Liu Bingbing 41117483 :250:100:175
第二个历程:显示出人的全名 和 ID号码 --- 对找出东西进行处理(执行动作)
# awk '$3~/^41/{print $1,$2,$3}' oldboy.txt|column -t
Zhang Dandan 41117397
Liu Bingbing 41117483
04. 显示所有ID号码最后一位数字是1或5的人的全名
第一个历程:找出id号码以1或5结尾信息 --- 找出信息
方法一:awk '$3~/1$|5$/' oldboy.txt
方法二:awk '$3~/[15]$/' oldboy.txt
第二个历程:显示全名信息 --- 找出信息做处理
awk '$3~/[15]$/{print $1,$2}' oldboy.txt|column -t
05. 显示文件中第二行,第三列的信息
第一个历程:匹配第二行
# awk 'NR==2' oldboy.txt
Zhang Xiaoyu 390320151 :155:90:201
第二个历程:显示第三列
awk 'NR==2{print $3}' oldboy.txt
测试. 利用awk取出IP地址信息(grep sed)
第一个历程:定位有IP地址的行 --- 找出信息
ip a s eth0|awk 'NR==3'
inet 10.0.0.201/24 brd 10.0.0.255 scope global eth0
第二个历程:只显示IP地址 --- 做处理 为什么是三前面和后面都有隐藏一个^ $
ip a s eth0|awk -F "[ /]+" 'NR==3{print $3}'
10.0.0.201
说明:在不指定-F参数信息,
1. 默认将多个连续的空格汇总为整体
2. 默认将一行头部开始空格信息忽略不计
ip a s eth0|awk -F "[^0-9.]+" 'NR==3{print $2}'
10.0.0.201
06. 显示Xiaoyu的捐款,每个捐款数值都有以$开头, 如$110$220$330
方法一:
# awk -F "[:]" '$2~/Xiaoyu/{print "$"$2"$"$3"$"$4}' oldboy.txt ???
$155$90$201
方法二:
# awk '$2~/Xiaoyu/{print $4}' oldboy.txt|sed 's#:#$#g'
$155$90$201
# awk '$2~/Xiaoyu/{print $4}' oldboy.txt|tr ":" "$"
$155$90$201
方法三:awk替换功能 sed tr
gsub(/要替换的信息/,"替换成什么",将第几列进行替换)
# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' oldboy.txt
$155$90$201
07.利用awk排除指定信息不要显示
awk '!/^$/' oldboy.txt
06. awk命令高级功能说明:
普通模式 正则表达式作为模式 ^ 还可以表示某一列的开始
$ 还可以表示某一列的结尾
比较表达式作为模式:
# awk 'NR==1{print $NF}' oldboy.txt
:250:100:17
范围模式:
awk 'NR==1;NR==2' oldboy.txt --- 只查看第1和第2行
awk 'NR==1,NR==3' oldboy.txt --- 查看第一到第三行
特殊模式 BEGIN 在处理文件之前先执行的动作
1)生成文件内容表头信息
# awk 'BEGIN{print "姓氏","名称","id号码","捐款记录"}{print $0}' oldboy.txt |column -t
姓氏 名称 id号码 捐款记录
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Xiaoyu zhang 390320151 :155:90:201
Meng Feixue 800412789 :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
2)用于在系统中进行运算数值
awk 'BEGIN{print 2+3}'
3) 修改或设置变量信息
a awk命令中,会直接将字符串信息当成变量 $1 $NF $0(取一行中所有列)
# awk 'BEGIN{oldboy=62;print oldboy}' -------设置变量
62
# awk 'BEGIN{oldboy=62;print "oldboy"}' -----不想识别出变量
oldboy
自定义变量:oldboy=62
内置变量:
NF : 显示最后一列信息 $(NF-1) 取倒数第2列
NR : 表示行号信息,取出第几行 NR==2 NR>=2 NR<=2
FS : 指定分隔符信息 -F
# awk -F ":" 'NR==1{print $2}' oldboy.txt
250
# awk 'BEGIN{FS=":"}NR==1{print $2}' oldboy.txt
250
# awk -vFS=":" 'NR==1{print $2}' oldboy.txt
250
END 在处理文件之后再执行的动作 ***
1)显示表格补充信息
# awk 'BEGIN{print "姓氏","名称","id号码","捐款记录"}{print $0}END{print "总结:这是一个学生登记表"}' oldboy.txt|column
姓氏 名称 id号码 捐款记录
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 800412789 :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
总结:这是一个学生登记表
2)显示计算的最终结果 OK
awk '/^$/{i=i+1}END{print i}' /etc/services
07. awk运算方法:
1)累加运算:a b c d 1+1+1+1
i=i+1 --> i++
练习题01:统计一个文件中有多少个空行
第一个历程:找出空行
awk '/^$/' /etc/services
第二个历程:做运算处理
# awk '/^$/{i=i+1;print i}' /etc/services
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# awk '/^$/{i=i+1}END{print i}' /etc/services
17
练习题02:统计/etc/passwd文件中最后一列有/sbin/nologin的出现了多少次
[# awk -F ":" '$NF~/nologin$/{i++}END{print i}' /etc/passwd
17
# awk '/nologin$/{i++}END{print i}' /etc/passwd
17
2)求和运算: 10 20 30 60
i=i+$n
实践操作:
# seq 10|awk '{i=i+$1;print i}'
1
3
6
10
15
21
28
36
45
55
# seq 10|awk '{i=i+$1}END{print i}'
55
08. 课程知识总结:
1)awk三剑客命令概述
1)作用:擅长取列 擅长统计运算
2)语法:awk 参数 '模式{动作}' oldboy.txt
模式:常用模式 特殊模式(BEGIN END)
3)原理:
2)awk三剑客命令练习
6道题 查(匹配信息) 修改替换 删除
awk命令参数:
-F : 指定分隔符号信息 ":" "[:/]" "[:/]+"
-v : 设置变量信息
awk命令动作:
print: 打印输出信息 空格 , " " 字符串 "oldboy" 变量信息 oldboy 指定列 $1 $NF $(NF-1) $0(所有列)
gsub: 替换指定列的信息 gsub(/要替换的内容/,"替换成什么",$N)
计算:
累加运算:i=i+1 i++
求和运算:i=i+$n
awk内置变量:
FS NF NR