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)
huchaoweihuchaowei
上一篇 2017-05-30
下一篇 2017-05-30

相关推荐

  • N26 第八周作业

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 网桥(network bridge) 网桥工作于物理层与数据链路层,在终端设备较多的局域网中可以用网桥设备将局域网分离为不同的冲突域(collision domain),减少网络冲突,提升网络传输效率 集线器(network hub) 集线器具有多个I/O端口,一个端口的输入信号…

    2017-02-25
  • Linux 根文件系统层级结构

    一、Linux根文件系统层级结构图 二、Linux根文件系统目录说明

    Linux干货 2016-09-26
  • 实验:httpd

    虚拟主机 httpd-2.4示例步骤: 1. 进行规划虚拟主机 192.168.209.8:80,192.168.209.10:80 www.10linux.com,www.iounix.com /var/www/html/10linux,/var/www/html/iounix 2. ]# mkdir /var/www/html/{10linux,ioun…

    Linux干货 2017-06-04
  • 公钥和私钥的原理

          今天上课老师讲到公钥和秘钥,模模糊糊听了个大概,始终还是不能够详细的理解公钥怎么会事?私钥怎么会事?工作原理是怎么的?今天在网上找了半天,通过查看大家对这个密钥对的理解,总算弄清楚了,咱就把我的心得写出来给大家对密钥对有疑问的同志们看看。      公钥和私钥就是俗称…

    Linux干货 2016-11-30
  • 逻辑卷管理器LVM

    一、LVM逻辑卷管理     lvm(Logical Volume Manage,逻辑卷管理)的重点在于可以弹性的调整filesystem的容量,而并非在于数据的存储效率及安全上面。需要文件的读写效能或者是数据的可靠性是RAID所考虑的问题。LVM可以整合多个实体partition在一起,让这些partitions看起…

    Linux干货 2016-09-02
  • Homework Week-11 加密、CA及DNS

    1、详细描述一次加密通讯的过程,结合图示最佳。 ——————————————————————&#…

    Linux干货 2016-11-01