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

相关推荐

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

    马哥教育网络班21期+第8周课程练习 1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 网桥是第2层的设备,它设计用来创建两个或多个LAN分段。其中,每一个分段都是一个独立的冲突域。网桥设计用来产生更大可用宽带。它的目的是过滤LAN的通信流,使得本地的通信流保留在本地,而让那些定向到LAN其他部分(分段)的通信流转发到那里去。每…

    Linux干货 2016-11-14
  • fstab配置文件、swap分区,文件关联

    fstab配置文件、swap分区,文件关联,lvm 挂载点和/etc/fstab  配置文件系统体系  被mount、 fsck和其它程序使用  系统重启时保留文件系统体系  可以在设备栏使用文件系统卷标  使用mount -a 命令挂载/etc/fstab中的所有文件…

    Linux干货 2016-09-01
  • grep,egrep及相应的正则表达式用法详解

    目录 1、grep简介     1.1、grep是什么     1.2、grep使用格式     1.3、grep常用选项 2、正则表达式与grep     2.1、正则表达式简介  &nb…

    系统运维 2016-08-22
  • Linux系统启动流程简介

    centos系统启动流程 本篇仅仅讲解centos5和6 centos7并不适用 Linux系统的组成部分:内核+根文件系统 内核功能: 进程管理 内存管理 网络管理 驱动程序 文件系统 安全功能 有以下目录结构的文件系统可以被识别为根文件系统,但根文件系统本身不存在 rootfs:/bin/ /sbin /etc/ /sys/…

    Linux干货 2016-09-10
  • Linux Network Manager

    Linux Network Manager Network简述 Switch,Router简述 Linux Network 配置方法 ifcfg家族命令 ip家族命令 rhel7 nmcli命令 配置文件 Network简述 Network是什么? 网络是将分布在地理位置不同的计算机通过物理线路的连接,在网络软件的管理下,实现数据通信的过程。&nb…

    Linux干货 2016-04-05
  • 第五周博客作业

      感觉进入了年底,明显的时间不够,不管怎么说,还是要努力跟上学习的进度,不能给自己松懈找借口!  1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行; [root@localhost ~]# grep "^[[:space:]]\+" /boot/grub/grub.co…

    Linux干货 2017-01-03