4) 三剑客-awk
4.1)特点与应用场景
awk |
一门语言,类似于C语言 |
过滤,统计,计算 |
过滤,统计日志 |
4.2 执行过程
awk -F, 'BEGIN{print "name"}{print $2}END{print "end of file"}' 文件名
“以逗号为分隔符,取第二列”
4.3)行与列
名词 | awk中叫法 | 一些说明 |
行 | 记录 record | 每一行默认通过回车分割的 |
列 | 字段,域 filed | 每一列默认通过空格分隔的 |
awk中行和列结束标记都是可以修改的 |
---1 取行:
awk | ||
NR==1 | 取出某一行 | |
NR>=1&&NR<=5 | 取出1到5行 范围 | |
符号 | > < >= <= == != | |
-----2)取列
-F 指定分隔符,指定每一列结束标记(默认是空格,连续的空格 tab键)
$数字 取出某一列,注意:在awk中$内容 一个意思 表示取出某一列
$0 整行的内容
{print XXX}
$NF表示最后一列
取出第5列和最后一列,按列对齐(column -t)
####取出passwd第一列和最后一列
#####使用awk调换passwd 第一列和最后一列内容,然后显示每一行的内容(调换后的)
3)小结
行与列 名称
awk取行与取列,指哪打哪
##取出网卡IP内容
awk内置变量
内置变量 | ||
NR | Number of Record记录号,行号 | |
NF | Number of Field 每行有多个字段(列)$NF表示最后一列 | |
FS | -F: 等价于-v FS=: Field Separator字段分隔符,每个字段结束标记 | |
OFS | Output Field Separator输出字段分隔符(awk显示每一列的时候,每一列之间通过什么分隔,默认是空格) |
4.4 awk模式匹配
awk -F"[ /]+" 'NR==3{print $3}'
awk | -F"[ /]+" | 'NR==3{print $3}' |
命令 | 选项 | '条件”{动作}' |
'找谁{干啥}' | ||
'模式{动作}' | ||
<'pattern{action}' |
比较符号: > < >= <= == !=
正则:
范围 表达式:
特殊条件:BEGIN和END
1)比较表达式-参考上面取行部分
2)正则
//支持扩展正则
awk可以精确到某一列,某一行中包含/不包含......内容
~包含
!~不包含
正则 | awk正则 |
^表示以...开头的行 | 某一列的开头 $3~/^oldboy/ |
$表示以...结尾的行 | 某一列的结尾 $4~/lidao$/ |
^$表示空行 | 某一列是空的 很少用 |
####第三列里以1开头
####找出 第三列以2开头的行,并显示第一列,第三列和最后一列
####找出 第三列以1或者2开头的行,并显示第一列,第三列和最后
3)表示范围
/哪里开始/,/哪里结束/ 常用
NR==1,NR==5 从第一行开始到第5行结束,类似于sed -n '1,5p'
#显示指定实际范围内容的IP地址和用户访问uri
4)特殊模式BEGIN{}和END{}
模式 | 含义 | 应用场景 |
BEGIN{} | 里面的内容会在awk读取之前执行 |
1)进行简单统计,计算,不涉及读取文件(常见) 2)用来处理文件之前,添加个表头(了解) 3)用来定义awk变量(很少用,因为可以用-v) |
END{} | 里面的内容会在awk读取之后执行 |
1)awk进行统计,一般过程:先进行计算,最后END里面输出结果 2)awk使用数组,用来输出数组结果(常见) |
END{}统计计算
统计方法
统计方法 | 简写形式 | 应用场景 |
i=i+1 | i++ | 计数,统计次数 |
sum=sum+??? | sum+=??? | 求和,累加 |
注意:i,sum都是变量 |
###统计/etc/service里面有多少个空行
###seq 100 求和1+2+3+....+100 awk实现
###如果想查看过程