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

相关推荐

  • 从Linux小白到大牛——与狼共舞的日子5

    马哥教育网络班21期+第5周课程练习 1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行。 [root@localhost ~]# grep '^[[:space:]]\+' /boot/grub/grub.conf 2、显示/etc/rc.d/rc.sysinit文件中以…

    Linux干货 2016-08-31
  • 正则表达式

    正则表达式是一种以一些字符赋予特殊意义之后,用来表达字符串,用以筛选各种形式的字符串用来进行查找、替换、删除等各种文本编辑作用的一种表示方式。 正则表达式的特殊字符 字符表示 .   可以表示任意可打印字符 [] 中括号范围内任意单个字符 [^] 中括号范围外任意单个字符 (相对所有可打印字符) [:space:] 表示任意单个空白字符 [:dig…

    2017-08-03
  • 软链接和硬链接及两者之间的不同

    在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号…

    Linux干货 2016-12-05
  • Linux基础知识之IO重定向

    该博文以CentOS6.8_x86_64系统为基础,Xshell 5远程连接CentOS系统,以root身份登录系统。  什么是I/O重定向?       所谓I/O重定向简单来说就是一个过程,这个过程捕捉一个文件,或者命令,程序,脚本,甚至脚本中的代码块(codeblock)的输出,然后把捕捉到的输出,作为输入发送给…

    Linux干货 2016-07-26
  • Linux基础知识(一)

     本文的主要内容是:  1.计算机基本组成及其功能  2.linux的发行版,以及他们之间的联系和区别  3.Linux的哲学思想  4.Linux的上的命令的使用格式  5.基础命令 ifconfig,echo,tty,startx,export,pwd,history,shutdown,powe…

    Linux干货 2016-09-17
  • 【推荐】Linux 简单部署LAMP

    Linux 简单部署LAMP: 实验环境: 1、主机系统Centos6.7_X86_64 2、DNS&CA:192.168.3.10 3、LAMP安装方式为rpm 4、主机IP:192.168.3.11提供web站点:     http://wp.neolinux.com     &nbsp…

    Linux干货 2016-06-22