Shell三剑客—文本分析工具:awk
-
介绍
grep,sed,awk 是shell 编程中经常用到的文本处理工具(shell编程三剑客)。它们是一种编程语言,主要用来处理结构化的数据和生成格式化的报告。awk 可以在非交互的情况下完成相当复杂的文本处理操作。awk提供了极其强大的功能:它可以完成 grep和sed 所能完成的所有工作。
-
格式
awk 选项 ‘模式或条件 {编辑指令}’ 输入文件
-F 指定分割符(默认为空格)
$0 显示被匹配到的整行
$1,$2… 列位置参数
!取反
// 字符匹配
-
工作原理
逐行读取文本,默认以空格为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令(默认打印内容)
若需要查找出/filename 的用户名、用户ID、组ID等列,使用下面的 awk 命令就可完成:awk -F : "{print $1,$3,$4}' /filename
-
简单应用
#以:为分割符显示这个文件的第1列
awk -F: '{print $1} /filename
#以/为割符显示这个文件的第4列
awk -F/ '{print $4}' /filename
#以默认分隔符(空格分割符),打印整个文件($0表示整个文件列)
awk '{print}‘ /filename awk '{print $0}’ /filename
#以默认分割符显示这个命令的第1列和第3列
df -h |awk '{print $1,$3}'
-
模式匹配+正则
#以:号为分割符,打印带 root字符的行
awk -F: '/root/' filename
#以:号为分割符,打印开头是root字符的行
awk -F: '/^root/' /filename
#以:号为分割符,打印开头非root字符的行,!取反的意思
awk -F: '!/^root/'/filename
#以空格为分隔符,打印结尾为nologin的行
awk '/nologin$/' /filename
#以默认分割符,显示以/开头的行的第一列(!取反)"
df -h |awk '/\/$/' df -h |awk '/\/$/{print $1}
#打印文件中空行
awk '/^$/' /etc/fstab
#以:号为分割符,打印开头是root字符或者ftp字符的行
awk -F: '/^(rootlftp)/' /filename awk -F: '/^(root|ftp)/{print $1,$7}' /filename
#过滤从9点21分44秒开始,到9点30分01秒结束中间所有的行字符
awk ‘/09:21:44/,/09:30:01/’ /var/log/messgae
-
条件操作描述符
关系操作符:
> >= < <= ==(精准匹配) !=(不等于)
条件表达操作符
或|| 与&& 非!
匹配操作符
~(模糊匹配) !~(模糊匹配取反)
算术操作符
+ - * / %
#打印不包含root字符的行
awk -F: '$1!~"root"' /filename awk -F: '$1~"root"' /filename
#以:分割,匹配第七列以 login 结尾的行,打印第1列
awk -F: '$7~"login$"{print $1}' /filename
#打印/filename 文件中第一列及第二列第三列第四列加起来的总和
awk '{print $1,$2+$3/$4}' /filename awk '{print $1,$2-$3*$4}' /filename
#以:为分割符,如果第七列等于/bin/bash 就打印第1列
awk -F: '$7=="/bin/bash"{print $1}’ /filename awk -F: '$7!~"/bin/bash"{print $1}' /filename
#以默认空格为分割符,以K开头并且第三列等大于等于60的行打印出来
awk '/^K/ && $3>=60' /filename
-
内置变量
NR:已读的记录行数
NF:浏览记录的列个数