AWK由浅入深
1. AWK的讲解
它适合文本处理和报表生成。
awk --version
linux上awk是gawk
    
2. awk的格式
awk是由模式,动作组合而成。
awk [option] 'pattern{action}' file
option:参数选项
pattern:条件
action:执行的动作
3. awk的执行过程
1. awk读入第一行内容
2. 判断是否符合pattern中的条件
1. 如果匹配就执行动作
2. 否则读取下一行
3. 继续读下一行
4. 重复2---3,直到结尾。
 
4. awk的变量
1. awk内置变量之记录变量
FS: 读取文本时,使用的字段分隔符
例子:
awk 'BEGIN{FS=":"}{print $1}' /etc/passwd
awk -F ':' '{print $1}' /etc/passwd
这两个结果是一样的
RS: 读取文本信息使用的换行符
例子: 把某一行内容,读取出来,再换行显示出来
1.txt
a|b|c
代码:awk 'BEGIN{ RS="|"; } { print $0 }'
a
b
c
OFS: 输出字段分隔符
例子: 打印出1,2,3,4列,以逗号作为分隔符
awk -F ':' 'BEGIN{OFS=","}{print $1,$2,$3,$4}' /etc/passwd
root,x,0,0
bin,x,1,1
daemon,x,2,2
adm,x,3,4
lp,x,4,7
ORS: 输出时的行分隔符
ORS是RS的逆向运行,也就是把多行内容转换成一行
例子:
awk 'BEGIN{ORS="-"}{print $0}' /etc/passwd | head -10
root:x:0:0:root:/root:/bin/bash-bin:x:1:1:bin:/bin:/sbin/nologin-daemon:x:2:2:daemon:/sbin:/sbin/nologin-adm:x:3:4:adm:/var/adm:/sbin/nologin-lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin-sync:x:5:0:sync:/sbin:/bin/sync-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown-halt:x:7:0:halt:/sbin:/sbin/halt-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin-uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin-operator:x:11:0:operator:/
2. awk内置变量之数据变量
NR: 文本行号
例子:
awk '{print NR}' /etc/passwd 当前文件的每一行的行号
NF: 字段总数
例子:
awk -F ':' '{print NF}' /etc/passwd 每一行的字段数
awk -F ':' '{print $NF}' /etc/passwd 每一行的最后一个字段
FNR: FNR与NR的区别在于,分析多个文件时,NR以所有文件作为参考记录行号,而FNR以行所在文件记录行号。
例子:
[sysadmin@192 ~]$ awk '{print FNR}' /etc/shells /etc/passwd 
1
2
3
4
5
6
1
2
3
4
5
6
7
8
9
10
3. awk自定义变量
变量名命名只能使用字母数字下划线,且不能以数字开头,gawk变量名称区分大小写。
1. 在脚本中赋值变量
awk 'BEGIN{test="hello";print test}'
2. 在命令行中赋值变量
awk -v test="hello" 'BEGIN{print test}'
5. awk的操作符
1. 算术操作符
-x: 负值
+x: 转换为数值
x**y: 次方
x/y: 除法
x*y: 乘法
x+y: 加法
x-y: 减法
x%y: 取余
2. 比较操作符
x < y
x <= y
x > y
x >= y
x == y
x ~ y
x !~ y
3. 赋值操作符
=
+=
-=
*=
/=
++
--
4. 逻辑关系符
&&
||
5. 条件表达式
selector?if-true-exp:if-fales-exp
例子:
a=3
b=4
a>b?a is max:b is max
6. awk常见的模式类型
1. 正则表达式
awk -F: '/^r/{print $0}' /etc/passwd
2. 表达式
awk 'NR==5{print $0}' /etc/passwd 取出第5行
awk -F ':' '$4==500{print $0}' /etc/passwd 取出第4列等于500的那一行
awk -F ':' '$7=="/sbin/nologin" && $4==522{print $0}' /etc/passwd 取出第7列等于/sbin/nologin并且第4列等于522的那一行
awk -F ':' '$4+1>500{print $0}' /etc/passwd 取出第4列加1后大于500的行
awk -F: '$7 ~ "bash$"{print $0}' /etc/passwd 取出第7列以bash结尾的行
3. ranges模式
4. BEGIN END模式 仅在awk命令执行前运行一次或结束前运行一次
例子:
awk -F: 'BEGIN{print "username a id "}{print $1,$2,$3}END{print "OK!"}' /etc/passwd
username a id root x 0 bin x 1 daemon x 2 adm x 3 lp x 4 sync x 5 shutdown x 6 halt x 7 mail x 8 OK!
5. Empty模式 打印出所有行
例子:
awk '{print $1}' /etc/passwd
7. awk常见的action
1. if else
语法: if (condition) {then-body}
例子:
awk -F: '{if ($1=="root") print $1,"admin";else print $1,"common user"}' /etc/passwd
root admin bin common user daemon common user adm common user lp common user sync common user
awk -F: -v sum=0 '{if ($3>=500) sum++}END{print sum}' /etc/passwd
6
2. while 循环字段
3. do while
4. for
5. case
8. awk实战例子
1. 以某一个字段的数值排序
grep "QTime=" /var/solr/logs/solr.log | awk -F "QTime=" '{print $1,$2}' | sort -k17 -rn | grep -v "path=/update" > /tmp/solrslow.txt
2. 查询某个时间段的日志
awk ' $2>"10:00" && $2<"11:00" ' catalina.out 查看10点到11点之间的日志信息
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号