awk(一)简介

一    AWK的简介

         awk 是一种很棒的语言,它适合文本处理报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等。在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk将会使你的工作变的高大上。 awk 是三剑客的老大,利剑出鞘,必会不同凡响。

        AWK是一种优良的文本处理工具。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(  awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)的最大功能取决于一个人所拥有的知识。AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上 AWK 的确拥有自己的语言:AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描(pattern)和处理语言(action)”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报 表,还有无数其他的功能。

       快速掌握awk的技巧:只要记住awk是以行为单位读入和输出的。

       awk语言的最基本功能描述:在文件或者字符串中(操作对象object)基于指定规则(模式pattern)浏览和抽取信息(干什么action),awk抽取信息后,才能进行其他文本操作(管道命令)。

二    使用方法

awk [option]  'pattern {action}' {filenames}

option

[-F option]       - 指定'输入分隔符',可以是字符串或者正则表达式
[-v var=value]    - '赋值一个用户定义变量',将外部变量传给awk
[-f program-file] - awk 允许将'一段awk 程序写入一个文本文件',然后在awk 命令行中用-f 选项调用并执行这段程序

(1) pattern 表示 AWK 在数据中查找的内容,pattern就是要表示的正则表达式,用斜杠括起来

(2) action 是在找到匹配内容时所执行的一系列动作命令

(3)花括号'{}'不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组

通常awk是以文件的一行为处理单位的;awk每接收文件的一行,然后执行相应的命令,来处理文本。

强调:对于处理的每一行pattern,action可能是毫无关系的操作!

pattern和action说明

输入行被'分成了一些记录':记录'默认由换行符分割',因此输入会'按照行进行分割',程序使用'给定的条件'一个个的测试每条记录,并执行测试通过的条件所对应的action
pattern和action都可以省略不写, 但是'不能同时不存在!!!'
无pattern默认匹配全部的记录;
而无action则是打印原始记录。
简单的AWK表达式之外,'pattern可以是BEGIN或END';
这两种条件对应的action分别是读取所有的记录之前和之后,同时如pattern1, pattern2的条件表示符合条件pattern1和pattern2的记录及其之间的部分

三    pattern的详细介绍

(1)BEGIN 和END模式(不需要去读取文件的内容)

(2)其他pattern

    1. '空模式',就是平时'不添加任何模式参数'的情况,即会匹配文本中的每一行,对于满足条件的行执行相应的动作;如 awk '{print $0}' test  
    2. '关系运算模式'; 如 awk 'NF==5 {print $0}' test  
        关系运算符有:  
            <:小于  
            <=:小于等于  
            ==:等于  
            !=:不等于  
            >=:大于等于  
            >:大于  
            ~:与对应的正则匹配则为真  
            !~: 与对应的正则不匹配则为真  
    3. '正则模式':  
        正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本  
        awk '/正则表达式/{print $0}' /etc/passwd  
        当正则表达式中已经存在/ 号时,需要使用转义符对其进行转义;  
            如awk'/\/bin\/bash$/{print $0}' /etc/passwd  
            除此之外,awk在使用正则模式时,使用到的正则用法属于"扩展正则表达式"
            当使用{x, y}这种次数匹配的正则表达式时,需要配合--posix或--re-interval选项,否则会报错;  
    4. '行范围模式':pat1,pat2  
        注意相邻的正则表达式用逗号隔开,且都是以第一次匹配到的行为为准;  
        awk '/正则1/,/正则2/{动作}’ /some/file   
        这种方法还可以用多个关系表达式来达到效果:但相互之间用&&连接 如: awk 'NR>=3 && NR<=6 {print $0}' file  

运算符

五    常用的内置变量

- FS  '输入'字段分隔符(默认值为'空白字符',即空格和制表符,FS可以替换为其它字符,从而改变域分隔符),awk自动将连续的空格理解为一个分割符了
- OFS '输出字段分隔符',(默认值是一个空格),可以输出(指定tab)漂亮格式;
- RS  '输入记录分隔符',(输入换行符),指定输入时的换行符,默认换行;
- ORS '输出记录分隔符'(输出换行符),输出时用指定符号代替换行符,默认换行;
- $n  当前记录的'第n个字段',比如n为1表示第一个字段,n为2表示第二个字段。 
- $0  这个变量包含执行过程中'当前行的文本内容'
# FS/OFS/RS/ORS使用时都要用-v选项

- NF 表示'字段数',在执行过程中对应于当前的字段数(即当前行被分割成了几列),记录中最后一个域可以以$NF的方式引用
- NR 表示'记录数',当前处理的文本行的行号;
- FNR 同NR,各文件分别计数的行号;
- ARGC '命令行参数的个数';
- ARGV 包含'命令行参数的数组',保存的是命令行所给定的各参数;

# 这几个内置变量和FS/OFS RS/ORS不同的是,它们是在大括号内使用,且可以直接使用,不需要用-v参数;

特点:这几个内置变量和FS/OFS RS/ORS不同的是,它们是在大括号内使用,且可以直接使用,不需要用-v参数!

变量的命名

(1)变量名可以是语言关键字外的,只包含大小写拉丁字母,数字和下划线(“_”)的任意字

(2)操作符"+ - * /"则分别代表加,减,乘,除

(3)简单的将两个变量(或字符串常量)放在一起,则会将二者串'接为一个字符串'

(4)若二者间至少有一个是常量,则中间可以不加空格;但若二者均为变量,中间必须包括空格

(5)字符串常量是以双引号("")分隔的,语句无需以分号结尾。另外注释是以"#"开头的

三    awk的执行流程图

在这里插入图片描述

执行流程的过程说明

(1)进行逐行扫描文件(没有处理),第一行到最后一行!

(2)寻找匹配的特定模式的行,在行上进行操作!

(3)如果没有指定动作处理,则把所有的匹配都显示在标准输出!

[root@server2 ~]# awk 'NR==2' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin

(4)如果没有指定模式,则所有的操作的行都被处理!

awk '{print }' /etc/passwd

图片参考

六    相关参数的说明

 

七    awk的输入来源

#  标准输入、一个或者多个文件、其它命令的输出

#  shell能做的,它都可以做!
echo 1 2 |awk '{print $1,$2}'        #

awk -F : '{print $1,$2}' /etc/passwd # 默认OFS是空格!

ls |awk '{print $1}'                 # 命令行的输出

八  awk的语法格式

awk [optipons] 'command' filenames

awk [optipons] -f awk-scripts filenames

(1)选项

-f 从文件中读取处理命令
-F 指明行的段分隔符;分割针对输入时的数据。
# 支持模式匹配,扩展的正则表达式,目的是将行分割成为多个对象.或确定每次循环时待处理的对象
-v 自定义变量

(2)命令(command)

#  处理前             行处理       行处理后

#  BEGIN{}             {}          END{}

#  读文件前(初始化)   action         扫尾

处理前案例说明

# BEGIN初始化(做了一个简单计算),然后虽然读取了文件,但是没有进行任何的操作(没有action)!

awk 'BEGIN{print 12/3}' /etc/passwd # 4

# 定义字段分割字符--> 可以通过 -F :来指定!

awk 'BEGIN{FS=":";OFS=":"} {print $1,$2}'  /etc/passwd

# 输出时-->OFS替换','(默认是空格符号),替换为':'

# 注意:只能识别','-->($1,$2)!

#####注意:如果不是,号,不管多少个空格都是连续的!####

awk 'BEGIN{FS=":";OFS=":"} {print $1 $2    $NF}'  /etc/passwd

##### 一般OSF不这样完,下面的常用!

awk 'BEGIN{FS=":"} {print $1"----"$2 }'  /etc/passwd

END

awk 'BEGIN{print 1/2} {print "ok"} END {print "wzj110"}' /etc/hosts

# 说明几行就几个OK!

0.5
ok
ok
wzj110

# 注意:单引号和双引号的关系!

基础练习

awk '/^root/' /etc/passwd  # 打印该行(默认)

# 模式(匹配)-->处理(动作)

awk -F : '/root/{print $1}' /etc/passwd

awk -F : '$3>=1000{print}' /etc/passwd

# mysql:x:1000:1000::/home/mysql:/sbin/nologin

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值