Linux之awk初谈(一)
1.AWK应用场景
统计计算,过滤,统计日志
2. AWK 基本使用格式
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file [-F|-f|-v] : 参数-F,指定分隔符,默认是以空格作为分列符的。 参数-f调用脚本。 参数-v定义变量 var=value ;-v 设置变量:设置变量a,-va;设置变量b,-vb ' ' 引用代码块 BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符 // 匹配代码块,可以是字符串或正则表达式:内容的查找范围→过滤的文件内容(按行取数) NR 记录符,取行,不是真正的行数,是awk处理过的行数(如NR==2) / / 取内容(如/^b/匹配首,/$/匹配尾) {} 命令代码块,包含一条或多条命令 ; 多条命令使用分号分隔 END 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息 awk –F ":" 'NR==2{print $1}'取第一列,第二行 $ 表示取列的意思 $NR 已经读出的记录数,就是行号,从1开始 $0 表示取出所有列
awk变量参数举例:
[root@VM-4-13-centos awk]# awk -F "." -va=888 'BEGIN{print a}' 888
3.AWK内置变量
变量 描述 $n 当前记录的第n个字段,字段间由FS分隔 $0 完整的输入记录 ARGC 命令行参数的数目 ARGIND 命令行中当前文件的位置(从0开始算) ARGV 包含命令行参数的数组 CONVFMT 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 ERRNO 最后一个系统错误的描述 FIELDWIDTHS 字段宽度列表(用空格键分隔) FILENAME 当前文件名 FNR 各文件分别计数的行号 FS 字段分隔符(默认是任何空格) IGNORECASE 如果为真,则进行忽略大小写的匹配 NF 一条记录的字段的数目 NF和$NF的区别:NF获取到的是,每行列的个数;$NF获取到的是最后一列的值。 NR 已经读出的记录数,就是行号,从1开始 OFMT 数字的输出格式(默认值是%.6g) OFS 输出字段分隔符,默认值与输入字段分隔符一致。 ORS 输出记录分隔符(默认值是一个换行符) RLENGTH 由match函数所匹配的字符串的长度 RS 记录分隔符(默认是一个换行符) RSTART 由match函数所匹配的字符串的第一个位置 SUBSEP 数组下标分隔符(默认值是/034)
4.awk的条件
条件的类型 条件 说明 awk保留字 BEGIN 在awk程序一开始时,尚未读取任何数据之前执行。BEGIN后的动作只在程序开始时执行一次 awk保留字 END 在awk程序处理完所有数据,即将结束时执行。END后的动作只在程序结束时执行一次 关系运算符 > 大于 关系运算符 < 小于 关系运算符 >= 大于等于 关系运算符 <= 小于等于 关系运算符 == 等于。用于判断两个值是否相等,如果是给变量赋值,请使用“”号 关系运算符 != 不等于 关系运算符 A~B 判断字符串A中是否包含能匹配B表达式的子字符串 关系运算符 A!~B 判断字符串A中是否不包含能匹配B表达式的子字符串 正则表达式 /正则/ 如果在"//"中可以写入字符,也可以支持正则表达式
awk -F "分隔符" '{BEGIN{读文件前执行这块BEGIN语句}pattern{语句块}END{读完文件后,执行这个END语句块}}'
BEGIN
BEGIN是awk的保留字,是一种特殊的条件类型。BEGIN的执行时机是“在 awk程序一开始时,尚未读取任何数据之前执行”。一旦BEGIN后的动作执行一次,当awk开始从文件中读入数据,BEGIN的条件就不再成立,所以BEGIN定义的动作只能被执行一次。
pattern{ commands }语句块当扫描一行的时候,pattern语句块会执行一完遍。扫描下一行的时候,pattern会接着执行完一遍。一直循环下去,直到扫描到最后一行。
END
END也是awk保留字,不过刚好和BEGIN相反。END是在awk程序处理完所有数据,即将结束时执行。END后的动作只在程序结束时执行一次。
5.AWK实例
5.1 输出文本行列
cat awk.txt
name age sex jack 18 男 ben 28 男 hilun 38 女 wumen 48 男
5.1.1 利用awk输出全部内容
awk '{print $0}' awk.txt
name age sex jack 18 男 ben 28 男 hilun 38 女 wumen 48 男
5.1.2 输出第四行
awk 'NR==4{print $0}' awk.txt
[root@localhost home]# awk 'NR==4{print $0}' awk.txt hilun 38 女
5.1.3 输出第二行第二列
awk 'NR==2{print $2}' awk.txt
[root@localhost home]# awk 'NR==2{print $2}' awk.txt 18
5.2 输出文本BEGIN,END,条件
cat bwk.txt
[root@localhost home]# cat bwk.txt name age sex jack 18 男 ben 28 男 hilun 38 女 wumen 48 男 hen 55 男 jj 42 男 bo 23 男 wen 31 女 wuwu 22 女 hihi 25 女 [root@localhost home]#
5.2.1 BEGIN,END
awk 'BEGIN{print "人员信息表"} {print $0} END{print "-- 到底啦 --"}' bwk.txt
[root@localhost home]# awk 'BEGIN{print "人员信息表"} {print $0} END{print "-- 到底啦 --"}' bwk.txt 人员信息表 name age sex jack 18 男 ben 28 男 hilun 38 女 wumen 48 男 hen 55 男 jj 42 男 bo 23 男 wen 31 女 wuwu 22 女 hihi 25 女 -- 到底啦 --
5.2.2 查询大于30岁且是女性的信息
[root@localhost home]# awk 'BEGIN{print "人员信息表"} $2>30 && $3 == "女" {print $0} END{print "-- 到底啦 --"}' bwk.txt
人员信息表
hilun 38 女
wen 31 女
-- 到底啦 --
5.2.3 找出名字h开头(模糊查询)且年龄在20岁以上的
[root@localhost home]# awk 'BEGIN{print "人员信息表"} $1 ~ "^h" && $2 >20 {print $0} END {print "-- 到底啦 --"}' bwk.txt
人员信息表
hilun 38 女
hen 55 男
hihi 25 女
-- 到底啦 --
[root@localhost home]#
#注意“~”匹配查询,后面关键字要用引号引起来一定要双引号,^匹配头,$匹配尾。
5.3 参数-v 实例
[root@VM-4-13-centos awk]# cat renyuan.txt me age sex jack 18 男 ben 28 男 Cici 38 女 [root@VM-4-13-centos awk]# awk -va=2 '{print a,$a}' renyuan.txt #-va,设置变量a,初始值为2 2 age 2 18 2 28 2 38 [root@VM-4-13-centos awk]# awk -va=2 -vb=1 '{print a,$a,b,$b}' renyuan.txt #-va,-vb 设置变量a,b,初始值为2,1 2 age 1 me 2 18 1 jack 2 28 1 ben 2 38 1 Cici