Shell三剑客---文本分析工具:awk

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:浏览记录的列个数

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值