AWK 的用法

目录: 
一、概述 
二、awk基本语法格式 
三、awk基本操作 
四、awk条件及循环语句 
五、awk函数 
六、awk演示示例(源自于man手册)

一、概述

  1. 产品概述: 
    awk是一种编程语言,用于在linux/unix下对文本和数据进行扫描与处理。数据可以来自标准输入、文件、管道。 
    awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Peter Weinberger、Brian Kernighan。 
    实际上awk有很多种版本,如:awk、nawk、mawk、gawk、MKS awk、tawk… 这其中有开源产品也有商业产品。 
    目前在Linux中常用的awk编译器版本有mawk,gawk,其中以RedHat为代表使用的是gawk,以Ubuntu为代表使用的是mawk。 
    gawk是GNU Project 的awk解释器的开源代码实现。 
    本文将以gawk作为讲解工具。
  2. 原理: 
    1). awk逐行扫描文件,从第一行到最后一行,寻找匹配特定模式的行,并在这些行上进行你想要的操作。 
    2). awk基本结构包括模式匹配(用于找到要处理的行)和处理过程(即处理动作)。 
    pattern {action} 
    # 提示:awk读取文件内容的每一行时,将对比改行是否与给定的模式相匹配,如果匹配则执行处理过程,否则对该行不做任何处理。 
    如果没有指定处理脚本,则把匹配的行显示到标准输出,即默认处理动作是print打印行; 
    如果没有指定模式匹配,则默认匹配所有数据。 
    3). awk有两个特殊的模式:BEGIN和END,他们被放置在没有读取任何数据之前以及在所有数据读取完成以后执行。 
    二、awk基本语法格式
  3. 格式: 
    gawk [ POSIX or GNU style options ] -f program-file [ – ] file … 
    注释:POSIX or GNU style options表示gawk支持POSIX以及GNU两种选项;-f后接脚本文件;file表示准备处理的文档名称。
  4. gawk支持以下选项: 
    -F fs 
    –field-separator fs 
    指定以fs作为输入行的分隔符(默认分隔符为空格或制表符) 
    -v var=val 
    –assign var=val 
    在执行处理过程以前,设置一个变量var值为val 
    -f program-file 
    –file program-file 
    从脚本文件中读取AWK指令,以取代在命令参数中输入处理脚本 
    -W compat 
    -W traditional 
    –compat 
    –traditional 
    使用兼容模式运行awk,GNU扩展选项将被忽略 
    -W copyleft 
    -W copyright 
    –copyleft 
    –copyright 
    输出简短的GNU版权信息 
    -W dump-variables[=file] 
    –dump-variables[=file] 
    打印全局变量(变量名、类型、值)到文件中,如果没有提供文件名,则自动输出至名为dump-variables的文件中。 
    示例:[jacob@localhost ~]# awk -W dump-variables=out.txt ‘x=1 {print x}’ test.txt 
    -W exec file 
    –exec file 
    类似于-f选项,但脚本文件需要以#!开头;另外命令行的变量将不再生效 
    -W help 
    -W usage 
    –help 
    –usage 
    显示各个选项的简短描述
  5. awk程序结构 
    一个awk程序包含一系列的 模式 {动作指令} 或是函数定义。 
    模式可以是: 
    BEGIN 
    END 
    表达式 
    表达式,表达式 
    动作指令需要以{}引起来
  6. 简单示例:
[jacob@localhost ~]# awk '/^$/  {print  "Blank line}' test.txt 

三、awk基本操作

  1. 记录与字段 
    awk一次从文件中读取一条记录,并将记录存储在字段变量中。记录被分割为字段并存储在1,NF中(默认使用空格或制表符为分隔符)。 
    内建变量NF为记录的字段个数 
    示例:
[jacob@localhost ~]# echo  hello the world | >awk '{print $1,$2,$3}' 备注:读取输入行并输出第一个字段,第二个字段,第三个字段。
    [jacob@localhost ~]# echo  hello the world | >awk '{print $0}' 备注:读取输入行并输出该行。
    [jacob@localhost ~]# echo  hello the world | >awk '{print  NF}' 备注:读取输入行并输出该行的字段个数:3个字段。
    [jacob@localhost ~]# echo  hello the world | >awk '{print $NF}' 备注:读取输入行并输出该行的第三个字段,因为NF为3,所以$NF等同于取行的最后一个字段。
  1. 字段分隔符 
    默认awk读取数据以空格或制表符作为分隔符,但可以通过-F或FS(field separator)变量来改变分隔符。 
    示例:
[jacob@localhost ~]# awk  -F:  '{print $1}'  /etc/passwd
    [jacob@localhost ~]# awk 'BEGIN {FS = ":"} {print $1}'  /etc/passwd
    备注:以上两个示例均将字段的分隔符改冒号(:),即以冒号为分隔符打印passwd文件的第一个字段(帐号名称)。
    注意:如果使用FS改变分隔符的话,需要在BEGIN处定义FS,因为在读取第一行前就需要改变字段分隔符。
    进阶:指定多个字段分隔符(文档内容为:hello the:word,!)
     [jacob@localhost ~]# echo 'hello the:word,!' |
     >awk 'BEGIN {FS="[:, ]"}  {print $1,$2,$3,$4}'
3. 内置变量
以下为awk内置变量:
      ARGC        命令行参数个数
      FILENAME    当前输入文档的名称
      FNR        当前输入文档的当前记录编号,尤其当有多个输入文档时有用
      NR        输入流的当前记录编号
      NF        当前记录的字段个数
      FS        字段分隔符
      OFS        输出字段分隔符,默认为空格
      ORS        输出记录分隔符,默认为换行符\n RS     输入记录分隔符,默认为换行符\n 
  1. 表达式与操作符 
    表达式是由变量、常量、函数、正则表达式、操作符组成,awk中变量有字符变量和数字变量。如果在awk中定义的变量没有初始化,则初始值为空字串或0。 
    注意:字符操作时一定记得需要加引号 
    1) 变量定义示例: 
    a=”welcome to beijing” 
    b=12 
    2) 操作符(awk操作符与C语言类似) 

    • 乘 
      / 除 
      % 取余 
      ^ 幂运算 
      ++ 自加1 
      – 自减1 
      += 相加后赋值给变量(x+=9等同于x=x+9) 
      -= 相减后赋值给变量(x-=9等同于x=x-9) 
      = 相乘后赋值给变量(x=9等同于x=x*9) 
      /= 相除后赋值给变量(x/=9等同于x=x/9) 
      < 小于 

      大于 <br> 

      = 大于等于 
      <= 小于等于 
      == 等于 
      != 不等于 
      ~ 匹配 
      !~ 不匹配 
      && 与 
      || 或 
      操作符简单示例: 
      [jacob@localhost ~]# echo “test” | awk ‘x=2 {print x+3}’ 
      [jacob@localhost ~]# echo “test” | awk ‘x=2,y=3 {print x*2, y*3}’ 
      [jacob@localhost ~]# awk ‘/^/ {print x+=1}’   test.txt        备注:统计所有空白行  
        [jacob@localhost ~]# awk  ‘/^
      / {x+=1} END {print x}’ test.txt 备注:打印总空白行个数 
      [jacob@localhost ~]# awk -F: ‘1~/root/   {print3}’ /etc/passwd 备注:打印root的ID号 
      [jacob@localhost ~]# awk -F: ‘3>500  {print1}’ /etc/passwd 备注:列出计算机中ID号大于500的用户名

四、awk条件及循环语句 
1. IF条件判断格式: 
if (表达式) 
动作1 
else 
动作2 
或者if (表达式) 动作1;else 动作2 
说明:如果表达式的判断结果为真则执行动作1,否则执行动作2。 
示例:(判断boot分区可用容量小于20M时报警,否则显示OK) 
[jacob@localhost ~]# df |grep “boot” |awk ‘{if($4<20000) print “Alart”; else print “OK”}’ 

  1. 循环 
    while (条件) 
    动作 
    x=1 
    while (i < 10) { 
    print $i 

    示例: 
    [jacob@localhost ~]# awk ‘i=1 {} BEGIN { while (i<=10) {++i; print i}}’ test.txt

    do 
    动作 
    while (条件) 
    示例: 
    [jacob@localhost ~]# awk ‘BEGIN { do {++x;print x} while (x<=10)}’ test.txt 
    for (变量;条件;计数器) 
    动作 
    示例: 
    for (i=1;i<=10;i++) 
    print i 
    [jacob@localhost ~]# awk ‘BEGIN {for(i=1;i<=10;i++) print i}’ test.txt 
    [jacob@localhost ~]# awk ‘BEGIN {for(i=10;i>=1;i–) print i}’ test.txt 
    说明:因为以上循环语句使用的awk均使用的BEGIN模式,所以输入文档可以为任意文档(无关紧要)。

    1. Break与Continue 
      break 跳出循环 
      continue 终止当前循环 
      示例: 
      for (i=1; i<=10;i++) { 
      if (i=5) 
      continue 
      print i 

      说明:打印1-4,6-10 
      for (i=1; i<=10;i++) { 
      if (i=5) 
      break 
      print i 

      说明:仅打印1-4

五、函数 
1. rand () 产生0-1之间的浮动类型的随机数 
备注:rand产生随机数时需要通过srand()设置一个参数,否则单独的rand()每次删除的随机数都是一样的。 
示例: 
[jacob@localhost ~]# awk ‘BEGIN {print rand(); srand(); print srand()}’ test.txt 
2. gsub(x,y,z) 在字串z中使用字串y替换与正则表达式x相匹配的所有字串,z默认为在字串中使用字串替换与正则表达式相匹配的第一个字串,默认为0 
示例: 
[jacob@localhost ~]# awk -F: ‘gsub(/root/,”jacob”,0) {print0}’ /etc/passwd 备注:将passwd每行中所有的root修改为jacob显示至屏幕 
[jacob@localhost ~]# awk -F: ‘sub(/root/,”jacob”,0) {print0}’ /etc/passwd 备注:将passwd每行中第一个root修改为jacob显示至屏幕 
sub相当于sed中的s///,gsub相当于sed中的s///g。 
3. length(z) 返回字串z的长度 
示例: 
[jacob@localhost ~]# awk ‘{print length()}’ test.txt 备注:显示test.txt文档每行的字符长度 
4. gentline 从输入中读取下一行内容

原创文章,作者:huchaowei,如若转载,请注明出处:http://www.178linux.com/77175

(0)
上一篇 2017-05-30 18:43
下一篇 2017-05-30 20:31

相关推荐

  • Zabbix-3.2.3实现微信(WeChat)告警

    Zabbix-3.2.3实现微信(WeChat)告警 zabbix Zabbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是越来越多的企业开始使用zabbix结合微信作为主要的告警方式,这样可以及时有效的把告警信息推送到接收人,方便告警的及时处理。 关于邮件报警可以参考:Zabbix Web 邮件报警 一、微信企业号申请 地址: …

    2017-04-21
  • 第二周作业

    第二周

    Linux干货 2017-12-11
  • tomcat配置详解

    主程序: ·tomcat ·tomcat-admin-webapps ·tomcat-webapps ·tomcat-docs-webapp ·java-1.8.0-openjdk 配置文件: 配置文件目录:/etc/tomcat 主配置文件:server.xml webapps存放位置:/var/lib/tomcat/webapps/ webapps的根目…

    2017-08-08
  • 第七周作业

    1、创建一个10G分区,并格式为ext4文件系统; (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl; ]#mke2fs -t ext4 -b 2048 -L MYDATA -m 2 O acl /dev/sda1 (2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件…

    Linux干货 2017-03-11
  • bash变量详解

       shell作为用户和Unix/Linux沟通的桥梁,既可以是一个可执行的二进制程序,同时也是一个具备了编程能力的程序设计语言,定义了各种各样的变量和参数,下面介绍一下shell之上的各种变量。 1、本地变量    特性:只对当前shell生效 [root@centos7 ~/bin]#cat …

    Linux干货 2016-08-15
  • 单向加密原理

      单向加密算法对数据进行加密的过程分为两个步骤:   一、添加特征码           上图中说明了为数据添加特征码的步骤:       1、使用单向算法计算出特征码       2、使用私钥来加密特征码   &nb…

    Linux干货 2016-02-24