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 < 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