Shell编程5_文本处理三剑客(awk)

文本处理三剑客(awk)

1.awk介绍

这里写图片描述
AWK:三位创造者Aho、Weinberger和Kernighan统称
官方定义:一个优秀的样式扫描与处理工具
定位:AWK是一种用于处理文本的编程语言工具,主要用于格式化报文或从一个大的文本文件中抽取数据。提取原来文本中行的某些域进行计算组合显示,出结果

【扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行,直到文件末尾】

优点:
1.处理文件中的记录(与数据库相比)
2.简单,解释执行,不必编译(与C相比)
3.容易获得,unix自带(whereis awk)

2.awk参数格式

语法组成:【查找 -à 执行处理】
awk ‘pattern{action}’ filename
【注意,pattern在非括号中,用于查询筛选匹配行,action在括号中,action是在找到匹配内容时所执行的一系列命令,用于对筛选后的内容进行处理】

其中action内容可扩充,也可以有多个action。
执行顺序:awk一行行读入输入文件,顺序执行‘’内内容,按模式匹配来采取动作。
其他调用:awk可用内部变量和函数,条件与循环语句,也可执行数学运算和字符串操作。此外,可以使用BEGIN和END来执行处理前预操作和处理后后继操作。

格式
awk [ -F re] [parameter…] [‘prog’] [-f progfile]

3.处理机制

这里写图片描述
这里写图片描述

3-1.逐行处理

(1)会在内存中开辟一块awk处理文本的内存空间
(2)每一次读入文件中的一行文本到内存空间进行处理
(3)自带循环:处理完第一行并输出,然后再读入第二行,以此类推

3-2.切割字段

(1)可以根据指定的分隔符,把读入的一行文本切割成若干的字段
(2)每个字段都有对应的变量来表示

变量 含义
$0 读入的整行
$1 第一个字段
$2 第n个字段

(3)默认的字段分隔符是 空白符 (空格、tab键)
(4)而且个数不限,多个连续的空白符被识别为一个空白符

4.语句块使用场景

4-1.BEGIN语句块

BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如:变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中

4-2.END语句块

END语句块在awk从输入流中读取完所有的行之后即被执行,它也是一个可选语句块,比如:打印所有行的分析结果这类信息汇总都是在END语句块中完成

4-3.pattern语句块

pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块

5.操作练习

这里写图片描述

awk '{print FILENAME}' filename   ##filename有几行将打印出几个filename文件名
文件内容
文件内容

此处将/etc/passwd文件复制到当前目录
这里写图片描述

计数:
第几行(NR)有几列(NF)
awk {print NR,NF} filename 

这里写图片描述

awk   'BEGIN{print "NAME"}'  输入开始打印内容NAME,END在最后
awk ‘BEGIN{print “Username”}{print NR,NF,FILENAME}file 

这里写图片描述

【练习】查找系统中可交互式登陆系统的所有用户并以表头Username,Uid打印出来,末尾说明All can login system by x11

第一步:交互登陆用户使用的是bin/bash

awk '/\<bin\/bash\>/{print}'   /etc/passwd  查找含bin/bash的行\<bin\/bash\>精确查找

这里写图片描述

第二步:过滤用户名和UID

awk -F : '/\<bin\/bash\>/{print $1,$3}' /etc/passwd

这里写图片描述

第三步:打印开头信息
这里写图片描述

第四步:打印末尾信息
这里写图片描述

6.过滤

方法与grep大体一致

查找passwd中以root开头的行
awk '/^root/' passwd 查找passwd中以root开头的行

这里写图片描述

查找系统用户所用目录不是home下的可交互式登陆用户
awk -F : '/\<bin\/bash\>/&&!/\<home\>/{print $1,$6}' passwd

这里写图片描述

打印passwd 中行首不是a-d的行
awk '/^[^a-d]/' {print} passwd 其实不加{print}的时候相当于过滤,结果都一样

这里写图片描述

7.包含

awk -F : '$n~/root/{print}' passwd  passwd中第n列含root单词的行
awk -F : '$n!~/root/{print}' passwd  passwd中第n列不含root单词的行
awk -F : '$n~/root/{print $m}' passwd  passwd中第n列含root单词的行打印第m列
【练习】实验:打印eth0的ip
ifconfig team0 | awk  '/inet\>/{print $6}'
ifconfig team0 | awk  '/\<inet\>/{print $6}'

这里写图片描述

8.三剑客结束语:

awk grep sed其三者的应用丰富多样,文本处理是比较灵活的,只要符合规则,可以任意组合;面对不同的问题,写出多样的,符合实际情况的策略

猜你喜欢

转载自blog.csdn.net/zwhzwh0228/article/details/80839902