linux文本分析工具之`awk`

linux命令之awk

一、awk的功能

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在对数据进行分析处理时,显得尤为强大。

简单来说awk就是把文件逐行的读入,以指定的分隔符(默认为空格)将每行分成若干个field。然后可以通过编写各种逻辑,对这些field进行处理。

实际上 awk 的确拥有自己的语言: AWK 程序设计语言。它允许你创建简短的程序,这些程序可以实现:读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

二、awk的命令格式

  • 格式1:前置命令 | awk [命令选项] ‘条件{动作}…’ (注:动作中如果包含多条语句时,可以用分号分隔。支持多组条件和动作。

  • 格式2:awk [命令选项] ‘条件{动作} …’ 文件…

  • 常用命令选项:

    • -F:指定分隔符,默认空格或Tab符。可指定多个分格符-F"[,;?]":指定分格符为:,;?

    • -v:调用外部Shell变量

  • awk中的流程控制语句支持if/else、while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。

  • awk的条件类型:

    • BEGIN :是 awk 的保留字,是一种特殊的条件类型。BEGIN 的执行时机是"在 awk 程序一开始,尚未读取任何数据之前"。其动作仅执行一次。

    • END:也是 awk 的保留字,不过刚好和 BEGIN 相反。END 是在 awk 程序处理完所有数据,即将结束时执行的。其动作仅执行一次。

    • 关系运算:只有条件成立,动作才会执行;反之,动作不执行。

      #示例1
      cat /proc/net/dev |awk 'NR==2{print "11"} FR<=10{print "22"}'
      #示例2
      head -2 /etc/passwd  | awk '1!=2{print "hello"} BEGIN{print "YES"} NR%2==1{print "NO"}'
      #示例3
      awk -F: 'BEGIN{i=0}{if($3>500){i++}} END{print i}' /etc/passwd
      
      #示例4:条件:找出含有“inet”子串的行,并输出该行的第13个field
      注:$0表示整行,$1表示该行分隔后的第1个域,以此类推。
      ifconfig eth0 |awk -F"[ :]" '/inet/{print $13}'
      
      #示例5:列出以ro开头的用户记录
      awk -F: '/^ro/{print}' /etc/passwd     
      
  • awk中的相关运算符

    条件类型条 件
    awk保留字BEGIN
    awk保留字END
    关系运算符
    <小于
    >大于
    >=大于等于
    <=小于等于
    ==等于。用于判断两个值是否相等。如果是给变童赋值,则使用"=”
    !=不等于
    A~B判断字符串 A 中是否包含能匹配 B 表达式的子字符串
    A!~B判断字符串 A 中是否不包含能匹配 B 表达式的子字符串
    正则表达式/正则/
    逻辑运算符
    &&
    ||
    !
    算术运算符
    + - * / %
    ++ –
    += -= *= /= %=

三、awk的内置变量

内置变量含义
ARGC命令行参数个数
ARGV命令行参数排列
ENVIRON支持队列中系统环境变量的使用
FILENAMEawk浏览的文件名
FNR浏览文件的记录数,对多个文件单独计数,与NR不同
FS设置输入域分隔符,等价于命令行 -F选项
NF浏览记录的域的个数 ,即当前行的域个数
NR已读的记录数,即当前行数。对多个文件连续计数,与FNR不同
OFS输出域分隔符,默认是空格,用户可另外指定
ORS输出记录分隔符,默认是回车换行,用户可另外指定
RS控制记录分隔符

四、awk的自定义变量

  • 通过命令选项定义,变量名区分字符大小写:-v varname=value

  • 在动作中直接定义。

#/bin/bash
a=10
awk -v var=$a 'BEGIN{print var}'

awk -v var2="666test" 'BEGIN{print var2}'
#/bin/bash
awk 'BEGIN{var1=10;var2=20;print var1,var2;}'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值