awk介绍
awk是Linux及Unix操作系统中非常优秀的数据及文本处理工具,它是一种编程语言。
特点:
- 功能强大
- 完整语法
- 进程控制
- 简短高效
作用
- 自动化运维
- 文本处理
1.awk行处理方式与格式
- awk内嵌参数应用
- awk内嵌程序应用
awk处理方式
- awk一次处理一行内容
- awk对每行可以切片处理
awk格式
命令行格式
awk 'command' file(s)
脚本格式
awk -f awk-script-file file(s)
基本格式
awk 'command' file(s)
command:pattern{awk操作命令}
pattern:正则表达式;逻辑判断式
command1:pattern{awk操作命令}
操作命令:
内置函数:print() printf() getline
控制指令:if() {...}else{...} ; while() (...);
awk内置变量1
- $0 : 表示整个当前行
- $1: 每行第一个字段
- $2:每行第二个字段
- $3:每行第三个字段(列)
awk内置参数:分隔符
option: -F filed-separator
(默认为空格)
例如:$awk -F ':' '{print $3}'/etc/passwd
$awk -F ':' '{print $1,$3}' /et/passwd
或者
$awk -F ':' '{print $1 $3}' /et/passwd
打印空格
$awk -F ':' '{print $1 ‘\t' $3}' /et/passwd
打印制表符
打印第一列,第三列
$awk -F ':' '{print "User:"$1 "\t" "UID:"$3}' /et/passwd
增加打印字符
awk内置变量2
NR:每行的记录号
NF:字段数量变量
FILENAME:正在处理的文件名
例如
awk -F ‘:’ {print NR,NF}' passwd
打印行号,字段总数
awk -F ‘:’ {print FILENAME}' passwd
打印文件名
显示/etc/passwd每行的行号,每行的列数,对应行的用户名(print printf)
使用print的方法
awk -F ':' '{print "Line:"NR,"Col:NF,"User:"$1}' passwd
使用printf的方法
awk -F ':' '{printf("Line:%s Col:%s User:%s\n",NR,NF,$1)}' passwd
格式大小调整,整齐
awk -F ':' '{printf("Line:%s Col:%3s User:%s\n",NR,NF,$1)}' passwd
案例二:
显示/etc/passwd中用户ID大于100的行号和用户名(if...else...)
awk -F ':' '{if($3>100) printf("line:%s col:%s user:%s\n",NR,NF,$1)}' passwd
案例三
在服务器log中找出Error的方法日期(找到日志文件的Error行,提取第一列)
awk '/Error/{print $1}' fresh.log
command:pattern{awk操作命令}
pattern:正则表达式;逻辑判断式
awk 逻辑
,!: 匹配正则表达式
==,~=,<,>: 判断逻辑表达式
例如
awk -F ':' '$1~/^m.*/{print $1}' passwd
匹配第一位m的字段,并打印第一个字段
如man
mainl
mooc
awk -F ':' '$1!~/^m.*/{print $1}' passwd
取反,非m开头的字段
awk -F ':' '$3>100{print $1,$3}' passwd
找到第三列大于100的行,打印第一列,第三列
awk -F ':' '$3==100{print $1,$3}' passwd
等于100的行
awk -F ':' '$3!=100{print $1,$3}' passwd
不等于100的行
awk的扩展格式
awk[options] 'command' file(s)
command2扩展:
BEGIN{print "start"}pattern{commands} END{print "end"}
在基本格式前加入
读入行操作前执行,循环执行命令,所有命令运行后,才执行 BEGIN和END不参与循环
案例:
制表显示/etc/passwd每行的行号,每行的列数,对应行的用户名
awk -F ':' ’BEGIN{print "Line Col User"}‘{print NR,NF,$1}END{print "--------------"FILENAME"--------"}' passwd
案例1
统计当前文件夹下的文件/文件夹占用的大小
ls -l | awk 'BEGIN{size=0}{size+=$5}END{print "size is"size}'
案例2
统计显示/etc/passwd的账户总人数
awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print "count = "count}' /etc/passwd
匹配第一列 去除空行
统计显示UID大于100的用户名
判断,按次数追加第一列的nam,遍历打印name
awk -F ':' 'BEGIN'{count=0}{if ($3>100) name[count++]=$1}END{for (i=0;i<count;i++) print i,name[i])}
案例3
统计netstat -anp 状态下为LISTEN和CONNECTED的连接数量
netstat -anp |awk '$6~/CONNECTED|LISTTEN/{sum[$6]++}END{for (i in sum)print i,sum[i]}'
awd vs sed比较
都是处理文本
awk侧重于复杂逻辑处理
sed侧重于正则处理
awk和sed共同使用