awk基本用法

一、awk介绍

    awk、sed&grep都可以匹配文本,但sed和awk可以对文本进行编辑,grep则不具有此功能;sed是非交互式的流编辑器,而awk则是一门模式匹配的编程语言。awk主要用于处理匹配的文本,同时awk还支持编程语言的一些特性,如变量、函数、循环语句等。   

二、基本用法

       1)awk [options] 'program' File1,File2…

       program:Pattern{Action Statements}

       program通常位于单引号中,多个action语句之间用逗号分隔。

2)awk [options] 'BEGIN{ action;… } pattern{ action;… } END{action;… }' file …

       常用action:print printf

       常用options:

       -F:指明输入时用到的字段分隔符

       -v var=value:声明变量

三、awk的工作原理

       1)在处理文本之前,若存在BEGIN语句块,则先执行此语句块中的语句。

       2)将输入的文本或标准输入按回车(\n)分割,解析为多个记录(record,默认以\n分隔,记录的分割符可以同过awk的内置变量RS来更改)。

       3)记录会被切割成多个字段(filed,默认情况下,以空白字符切割不同的字段,包括空格和制表符,字段的分隔符可以通过-F选项及awk内置变量FS来指定),并将第一个字段存放在$1中,第二个字段存放在$2中,倒数第二个字段存放在$(NF-1),最后一个字段存放在$NF中。$0则表示匹配到的整条记录。

       4)如果读取到的记录与pattern想匹配,则执行器指定的action;若不匹配,则跳过action,直到完成所有的语句。

       5)当以条输入记录处理完成之后,继续读取下一条记录,重复上面的动作,直到处理完全部的输入。若果输入的是文件列表,awk将按顺序处理列表中的文件。

       6)awk处理完所有的输入之后,若存在END语句块,则执行END语句块中的语句。

       BEGIN、END语句都是可选的。

四、awk调用方式

主要有三种调用方式,分别为:

       1) awk命令行

       可以在命令行中使用awk 程序设计语言,也可以在shell script 程序中引用awk 命令行甚至awk 程序脚本。

       2) 使用-f 选项调用awk 程序

       awk 允许将一段awk 程序写入一个文本文件,然后在awk 命令行中用-f 选项调用并执行这段程序。

       3) 利用命令解释器调用awk 程序

       利用命令解释器功能,我们可以将一段awk 程序写入文本文件,然后在它的第一行加上#!/bin/awk –f.

五、awk使用详解

1、print:用于输出指定的内容

print item,item2,…

要点:

1)逗号分隔多个item

       2)输出的各item可以为字符串,也可以是数值、当前记录的字段、变量、awk表达式

       3)如省略item,相当于print $0,即输出被pattern匹配的记录。

例:在系统上每个用户名之前加上hello

blob.png

例:

blob.png

2、printf命令

用于格式化输出:printf Format,item1,item2,….

1)Format 必须给出

2)不会自动换行,需要给出换行控制符,\n

3)Format中需要分别为后面的每个item指定一个格式化符号。

格式符:

       %c:不现实字符本身,而是显示字符的ASCII码

       %d,%i:显示十进制整数

       %e,%E:以科学记数法数值显示

       %f:显示为浮点数

       %g,%G:以科学记数法或浮点数形式显示数值。

       %u:无符号整数

       %s:显示为字符串

       %%:显示%自身

例:显示用户名及其ID

blob.png

blob.png

  修饰符:对格式符进行修饰

              #[.#]:第一个数字控制显示的宽度(度量值:字符数),第二个表示小数点后的精度

              %3.1f

              :左对齐

              +:右对齐。默认为右对齐

例:在上例中,由于用户名的长度长短不一,在输出时不够清晰。使用修饰符能让输出更具易读性。

左对齐:

]#awk -F: '{printf "username is: %-15s;userid is %i\n",$1,$3}' /etc/passwd

blob.png

右对齐:

]#awk -F: '{printf "Your name is %+15s,your id is %i\n",$1,$3}' /etc/passwd

blob.png

3、变量

3.1 内建变量

       FS:input field separator,指定输入时的字段分隔符;默认为空白字符

       OFS:output field separator:指定输出时的字段分隔符;默认为空白字符

       RS:input record separator:指定输入时的换行符;默认为空白

       ORS:output record separator:指定输出时的换行符,默认为空白

       NF:number of field,每行的字段数量

              {print NF}

              $NF 标识最后一个字段

       NR:number of record,文件的行的数量

       FNR:若awk处理多个文件,则每个文件分别统计行数。若不指定,所有文件累计行数。

       FILENAME:当前文件名

       ARGC:命令行参数的

       ARGV:数组,保存的是命令行所给定的各参数

例:用FS指定字段分隔符,注意,在awk中,每个变量之前需要用-v来指定。

blob.png

例:指定输出的字段分隔符。

blob.png

blob.png

3.2 自定义变量

       (1)-v var=value

              注意:变量名区分大小写

       (2)在program中直接定义

blob.png

blob.png

4、操作符

       算术操作符:+ ,- ,* ,/ ,%, ^

              -n::转换为负数

              +n:将字符串转换为数值

       字符串操作符:没有符号的操作符,表示连接字符串

       赋值操作符:= ,+= ,-= ,*= ,/= ,^= ,%= ,++ ,–

       比较操作符:< ,> ,<= ,>= ,==, !=

       模式操作符:

              ~:左侧的字符串是否被右侧的模式所匹配

              !~:左侧的字符串是否被右侧的模式不匹配

       逻辑操作符: && || !

       函数调用:function_name(argu1,argu2…)

       条件表达式:selector?if-true-expression:if-false-expression

例:使用条件表达式判断用户是普通用户还是系统用户或管理员

awk -F: '{$3>1000?usertype="Common user":usertype="System or Sysadmin";printf "%15s:%s\n",$1,usertype}' /etc/passwd

blob.png

5、PATTERN

5.1)empty:空模式,匹配每一行

5.2)/Regular Expression/:仅处理被模式匹配的每一行

例:输出/etc/fstab文件中不是以UUID开头的行的第一个字段。

      输出/etc/fstab文件中以UUID开头的行的第一个字段。

blob.png

5.3)relational expression:关系表达式;结果有“真”有“假”;结果为真的才被处理。

真:结果为非0值表示为真,非空字符串也表示为真

假:0表示为假,空字符串也表示为假

例:

         1)输出uid大于1000的用户的用户名

       2)输出小于等于1000的用户的用户名

       3)输出shell为/bin/bash的用户的用户名及其shell

blob.png

blob.png

5.4)line ranges:指定行范围

       startline,endline:/part1/,/part2/

       注意:不支持直接给出数字的格式。

例:查找/etc/passwd文件中root到shutdown用户之间个用户的用户名及uid。

]#awk -F: '/^root\>/,/^shutdown\>/{print $1,$3}' /etc/passwd

blob.png

例:输出/etc/passwd中从第2行(不包括第2行)到第10行(包括第10行)的用户名及其UID

blob.png

5.5)BEGIN/END模式

       BEGIN{}BEGIN 语句块在awk 开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块。  END{}END 语句块在awk 从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END 语句块中完成,它也是一个可选语句。

例:

]#awk -F: 'BEGIN{print "   usernameuid\n--------------------"}{print $1,$3}END{print "-----------------\n        end        " }' /etc/passwd

blob.png

blob.png

原创文章,作者:M20-1钟明波,如若转载,请注明出处:http://www.178linux.com/48228

(0)
M20-1钟明波M20-1钟明波
上一篇 2016-09-21 13:28
下一篇 2016-09-21 14:05

相关推荐

  • 10yum源的配置

    yum仓库使用起来特别方便,然而使用之前当然是要配置的啦。下面就介绍一下怎么从0 配置一个yum仓库。 首先要创建yum仓库,当然不能使只给一台服务器用,那要给多个服务器用的话,就需要网络服务。yum仓库支持的网络服务有两种,FTP和HTTP。用yum主要用到的是数据传输,因此FTP更适合创建yum仓库,下面就以FTP为例,说明一下yum仓库的配置。 第一步…

    Linux干货 2016-11-04
  • sed对比grep之理解

    sed对比grep之理解 很多时候回车按下,没有结果,或是报错。 检查发现都是低级错误,关键是习惯刚学完grep,有写习惯没改过来。 sed语法很重要。script语法写对了,就成功了一大半,剩下的就是正则表达式的问题了。 sed与grep的区别是 grep是个行过滤器,筛选符合条件的行。也可以只显示每行匹配到的文本(-o选项),不对文本进行编辑,只是显示查…

    Linux干货 2016-08-10
  • select和case用法

    一、作业 1、斐波那契数列又称黄金分割数列,因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2) 写一个函数,求n阶斐波那契数列 2、汉诺塔(又称河内塔)问…

    Linux干货 2016-08-21
  • 详解用户,组,权限管理

    详解用户,组,权限管理 M21-陆东贵 测试环境:CentOS 7.2 内容介绍: 我们要使用操作系统进行工作,就需要人机交互操作,这时候计算机就需要创建用户,通过用户来实现操作,而且随着用户的增加需要给用户分组,这时候就需要对文件进行权限管理。 需要使用的工具:       用户相关工具:useradd; …

    Linux干货 2016-10-25
  • 个人思想的转变及对学习的态度

    了解linux已经一年多了,但实际上学习的次数并不多。我是在部队的时候通过网络了解到linux,刚开始接触的是乌班图系统,感觉这个系统美化比较漂亮,就安装在虚拟机里进行各种操作,但是对命令是一窍不通的,都是通过百度粘贴复制各种命令,在复制的是同时我也感觉到头大,这个系统的输入、输出怎么都是字母出现在屏幕上,顿时就感到兴趣失去了一大半,再加上自己英语也不好,就…

    Linux干货 2018-03-26
  • CentOS系统启动流程(上)

    CentOS系统启动流程(上)   作为系统运维人员,详细的了解操作系统的启动流程,对于我们日常排除故障大有益处,遇到相关的问题处理,能快速定位,迅速锁定关键点。 下面详细介绍一下,CentOS系统的启动过程,以供各位参考。由于linux各个发行版使用的启动方法略有不同,比如CentOS5使用的是initd,CentOS6使用的是较为接近的Upst…

    Linux干货 2016-06-09