网络三剑客之awk

引言

一、概述

  • AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
  • 它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作
  • 数据可以来自标准输入也可以是管道或文件
  • 20世纪70年代诞生于贝尔实验室,现在centos7用的是gawk。

之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

二、awk工作原理

  • 逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。
  • sed命令常用于一整行的处理,而awk比较、倾向于将一行分成多个""字段"然后再进行处理。
  • awk信息的读入也是逐行读取的,执行结果可以通过print的功能将字段数据打印显示。
  • 在使用awk命令的过程中,可以使用逻辑操作符"
    &&“表示"与”、“||表示"或”、"!“表示非”;还可以进行简单的数学运算,如+、一、*、/、%、^分别表示加、减、乘、除、取余和乘方。

命令格式

awk 选项 '模式或条件 {编辑指令}' 文件 1 文件 2 …
awk -f 脚本文件 文件 1 文件 2 …
格式:awk关键字    选项      命令部分  '{xxxx}'   文件名

三、常见的内建变量

参数含义
FS指定每行文本的字段分隔符,默认为空格或制表位
NF当前处理的行的字段个数
NR当前处理的行的行号(序数)
$0当前处理的行的整行内容
$n当前处理行的第 n 个字段(第 n 列)
FILENAME被处理的文件名
RS行分隔符

awk从文件上读取资料时,将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是’\n’
简说:数据记录分隔,默认为\n,即每行为一条记录。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、awk常用内置变量

命令含义
$1代表第一列
$2代表第二列以此类推
$0代表整行
NF一行的列数
NR行数

1.打印包含root的整行内容

在这里插入图片描述

2.打印包含root的行的第一列和第六列

在这里插入图片描述

3.显示root那一行的总列数

在这里插入图片描述

4.以:/为分割,打印包含root的行数

在这里插入图片描述

5.打印总行数

在这里插入图片描述

6.显示行号和每行的内容

在这里插入图片描述

7 打印有几行几列

在这里插入图片描述

8.查看本机ip、字节数、内存

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.打印文件最后一行

在这里插入图片描述

10.打印第二行

awk  'NR==2' /etc/passwd
awk  'NR==2{print}' /etc/passwd
两种是一样的效果,不加print也一样,默认就是打印

在这里插入图片描述

  • 逐行执行开始之前执行什么任务,结束之后再执行什么任务,用BEGIN、END
  • BEGIN一般用来做初始化操作,仅在读取数据记录之前执行一次
  • END一般用来做汇总操作,仅在读取完数据记录之后执行一次

五、awk的运算

1.案例:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.模糊匹配

~表示包含,!~表示不包含

在这里插入图片描述
在这里插入图片描述

3.数值与字符串的比较

比较符号:==      !=       <=       >=    <     >

(1)打印第五行内容

在这里插入图片描述
在这里插入图片描述

(2)打印行数 小于5行的内容

在这里插入图片描述

(3)打印出第三列等于0的行

在这里插入图片描述

(4)精确匹配一定是root的行

在这里插入图片描述

(5)打印出第三列大于等于1000的行

4.逻辑运算 && ||

(1)满足第3列小于10 或大于等于1000的行

在这里插入图片描述

(2)查看第三列大于10且小于等于1000的行

在这里插入图片描述

(3)打印出行号大于4且小于12的行

在这里插入图片描述

(4)打印出1~200之间所有能被7整除并且包含数字7的整数数字

在这里插入图片描述

六、其他内置变量

变量名含义
FS输入字段的分隔符 默认是空格
OFS输出字段的分隔符 默认也是空格
FNR读取文件的记录数(行号),从1开始,新的文件重新重1开始计数
RS输入行分隔符 默认为换行符
ORS输出行分隔符 默认也是为换行符

1.在打印之前定义字段分隔符为冒号

在这里插入图片描述

2.OFS定义了输出时以什么分隔

在这里插入图片描述

3.FNR的行号在追加当有多个文件时

[root@localhost ~]# awk '{print FNR,$0}' /etc/resolv.conf /etc/hosts   //可以看出FNR的行号在追加当有多个文件时
1 
2 nameserver 114.114.114.114
3 search localdomain
1 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
2 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@localhost ~]# awk '{print NR,$0}' /etc/resolv.conf /etc/hosts
1 
2 nameserver 114.114.114.114
3 search localdomain
4 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
5 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

在这里插入图片描述

4.RS:指定以什么为换行符,这里指定是冒号,你指定的肯定是原文里存在的字符

在这里插入图片描述

5.把多行合并成一行输出

在这里插入图片描述

1.awk高级用法

(1)定义引用变量

[root@localhost ~]# a=100
[root@localhost ~]# awk -v b="$a" 'BEGIN{print b}'    //将系统的变量a,在awk里赋值为变量b,然后调用变量b
100
[root@localhost ~]# awk 'BEGIN{print "'$a'"}'   //直接调用的话需要先用双引号再用单引号
100

在这里插入图片描述

(2)调用函数getline,读取一行数据的时候并不是得到当前行而是当前行的下一行

在这里插入图片描述

(3)显示奇偶数行

在这里插入图片描述

七、if语句:awk的if语句也分为单分支、双分支和多分支

单分支为if(){}
双分支为if(){}else{}
多分支为if(){}else if(){}else{}

[root@localhost ~]# awk -F: '{if($3<10){print $0}}' /etc/passwd    //第三列小于10的打印整行
[root@localhost ~]# awk -F: '{if($3<10){print $3}else{print $1}}' /etc/passwd    //第三列小于10的打印第三列,否则打印第一列

在这里插入图片描述
在这里插入图片描述

八、总结

以上就是awk全部内容啦,我们下次再见啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值