一.三剑客命令awk概念说明
官方概念说明
二.三剑客命令awk作用说明
1.处理文件信息 : 擅长处理日志文件信息
2.处理文件方式 :
01.排除信息 02.查询信息 03.统计信息 04.替换信息
三.三剑客命令awk语法原理
1.命令语法格式
01 . 标准格式
sed [参数] '条件-处理方式' 文件
awk [参数] '模式-动作' 文件
02 . 模式说明
匹配的条件信息
普通模式:
1.正则表达式作为模式
awk '/^oldboy/{print $n}'
2.利用比较匹配信息
NR==2 NR>=2 NR<=2 NR==2,NR==10
特殊模式: ******
BEGIN{}
概念说明:括号里面的内容会在awk读取文件之前执行
awk 'BEGIN(print "姓","名","QQ号","捐款记录"){print $0}' awk_test.txt
作用说明:
01.用于测试
02,用于计算
03.修改内置变量
END{}
概念说明:括号里面的内容会在awk读取文件之后执行
awk 'BEGIN(print "姓","名","QQ号","捐款记录"){print $0}END{print "end of life"}' awk_test.txt
作用说明:
01.显示计算最终结果
02,用于计算
03 . 内置变量
FS(file separator-文件分隔符) 字段分割符变量 -F ":"==BEGIN{FS=":"}==-vFS=":"
NR(number records(记录)) 表示行数信息 awk 'NR==1' awk_test.txt
NF(number of fields(域)) 表示每一行有多少列(调用即为最后一列) awk '$2~/Xiaoyu/{print $NF}' awk_test.txt
2.命令执行过程
与sed命令执行过程基本类似,也是从文件第一行,一行一行进行条件匹配,只不过有点区别是sed 会将模式空间中的内容输出到屏幕上,而awk不会, awk会看满足条件的行是否有动作,再决定是否将信息输出到屏幕上
四.三剑客命令awk实践操作
1.实践环境创建
2.命令操作实践
01.查询实践
001.查找实践参数
指定列的分隔符号(参数) -F ":" ---- 指定以 : 为分隔符
显示指定行号信息(模式) NR==n ---- 第 n 行信息
显示指定列的信息(动作) print ---- 将信息打印到屏幕上
gsub ---- 对显示出信息进行替换操作
002.查找案列说明
按行查找文件数据信息
awk 'NR==1' awk_test.txt
按字符查找文件数据信息
awk '/155/' awk_test.txt
按行按列查找文件数据信息
awk 'NR==1{print $1 $2}' awk_test.txt
awk -F "[ :]+" 'NR==1{print $1 $2 $(NF-1)}' awk_test.txt
[ :]+ 以空格和:作为分隔符 +的意思是将连续的空格或: 看做一个整体
(NF-1) NF意为最后一个字符.NF-1即为倒数第二行
awk '$3~/0+/' awk_test.txt
$3 第三列
~ 表示匹配或者包含什么信息
!~ 表示不匹配或者不包含什么信息
02.查询测验
001.按照行号查询信息
awk 'NR==1' awk_test.txt 查找单行信息
awk 'NR==1,NR==3' awk_test.txt 查找连续多行信息
awk 'NR==1;NR==3' awk_test.txt 查找不连续多行信息
002.显示字符查询信息
awk '/Xiaoyu/' awk_test.txt 查找单行信息
awk '/Xiaoyu/,/Waiwai/' awk_test.txt 查找连续多行信息
awk '/Xiaoyu/;/Waiwai/' awk_test.txt 查找不连续多行信息
003.显示Xiaoyu的姓氏和id号码
1.条件: 找出Xiaoyu所在行
2.动作: 显示此行指定列的信息 print
3.思路: 按照Xiaoyu找出对应行,利用{print $n,$m} 匹配多列 将信息打印出来
4.实践: awk '/Xiaoyu/{print $1","$3}' awk_test.txt
004.姓氏是Zhang的人,显示他的第二次捐款金额及他的名字
1.条件: 找出姓氏是Zhang的所在行信息
2.动作: 显示当前行指定列的信息
3.思路: 按照Zhang找出所在行并列出最后一列,观察列出的列是以 :为分割符的, 利用-F参数.将:分割的列再进行分列.找出第二次捐款的信息,将两条命令合并,将分割符也合并.注意合并分割符的时候用 "[ ]" ,因为每列之间的空格往往很多没办法判断,此时加个+ 意为将多个连续的空格看成一个分割符, 再将所需要的信息列出
4.实践: awk -F "[ :]+" '/Zhang/{print $1,$2,$(NF-1)}' awk_test.txt
005.显示所有以41开头的id号码的人的全名和id号码
1.条件: 显示以41开头的id号 id号码在当前文件的第三列 考虑利用 ~ 匹配信息
2.动作: 显示当前列所在行的指定信息
3.思路: 利用~的作用匹配第三列满足特定条件的信息
4.实践: awk '$3~/^41/{print $1,$2,$3}' awk_test.txt
006.显示所有id号码最后一位数字是1或5的人的全名
1.条件: 显示指定列以1或5结尾 利用~匹配特定条件,条件中运用 | 匹配多个条件
2.动作: 显示当前行所在列的信息 column -t 将显示的信息列纵队. 即对齐
3.思路: ~ 对第三列进行最后一个字符条件匹配 | 连接多个或者关系条件 [] 多个条件存在或者关系
4.实践: awk '$3~/1$|5$/{print $1,$2}' awk_test.txt | column -t
awk '$3~/[15]$/{print $1,$2}' awk_test.txt | column -t
007.显示Xiaoyu的捐款,每个捐款前面都以$开头,如$110$220$330
1.条件: 按照字符找出对应行信息
2.动作: 显示捐款信息,再数值前赋值$ 利用gsub的替换功能 --- gsub(/需要替换的信息/,"修改成什么信息",$n-操作那一列)
3.思路: 找出第二列指定字符的是Xiaoyu的行并打印最后一列,对打印出来的列,进行额外的动作,执行gsub替换,把 : 替换成$符号 注意 gusb是个动作,需要跟print放到一起,又因为是两个不同的指令,所以中间需要用 ; 分割开
4.实践: awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' awk_test.txt
008.文件中空行/注释行进行排除
1.条件: 按照条件找出对应行
2.动作:
3.思路: $0 即意为全部信息 /^$|^#/ 空行和以#开头的信息. $0! 取反,即不需要匹配出来的信息
4.实践: awk '$0!~/^$|^#/' awk_test.txt
总结:awk命令中$符号的用法
$1 $2 $3 : 取第几列信息
$NF : 取最后一列
$(NF-n) : 取倒数第几列
$0 : 取所有列的信息
03.特殊模式:特殊模式应用案例
1.统计/etc/services中空行数量
2.统计/etc/services文件中有#开头的行
2.统计/etc/passwd文件中有多少普通用户 虚拟用户
步骤一:用户信息存放文件 /etc/passwd
步骤二:从文件中匹配出虚拟用户 普通用户 普通用户是/bin/bash 结尾的 awk '$NF~/bash/' /etc/passwd
步骤三:进行统计 awk '$NF~/bash/{i++}END{print i}' /etc/passwd
3.统计文件中的数值的和
sum=sum+$n(需要进行数值求和的列)
五.三剑客命令awk数组详述
1.数组知识学习准备 : 统计计算方法说明
i=i+1:
步骤一: 先计算右边,将右边数值给左边变量
步骤二: i=0 i=0+1 i=1+1 ..... 统计次数
列: awk '/^$/{i=i+1;print i}' /etc/services
awk '/^$/{i++;print i}' /etc/services
i=i+$0:
步骤一: 表示对每行的数字进行累加求和运算
步骤二: i=0 i=0+$0 i=$0(上一行)+$0 求和运算
列: seq 10|awk '{sum=sum+$n;print $n,sum}' $n 指定想把第几列信息做求和运算
2.数组概念知识说明
数组形式说明
hotel[110]="张三"
hotel 数组名称
[110] 数组元素
"张三" 元素内容
数组实际应用
awk 'BEGIN{h[110]="UFO";h[114]="XO";print h[110],h[114]}'
awk -F "[/.]+" '{h[$2]++}END{for(pol in h) print pol,h[pol]}' url.txt